文档首页 > > 最佳实践> 构建外卖订单业务应用> 构建后台功能程序> 构建获取配送

构建获取配送

分享
更新时间: 2019/12/20 GMT+08:00

函数参数

创建func-vehicle-reg函数,功能为配送员注册,存储配送员联系方式,创建用于通知配送员的topic,并用配送员的联系方式订阅该topic,参数说明如表1

表1 func-vehicle-reg函数

参数

配置项

函数名称

func-vehicle-reg

运行时语言

Python 2.7

执行入口

index.handler

代码上传方式

在线编辑

函数依赖包

2中获取的obs链接,示例链接:https://obs-yilai.obs.myhwclouds.com/dep.zip

内存

512

超时

200

自定义参数

protocol:sms;vehicle_list_bucket_prefix:vehicle-list-

操作步骤

  1. 登录函数工作流服务控制台,进入"函数"界面,单击"创建函数",进入创建函数流程。
  2. 输入函数信息

    1. 填写基本配置信息

      函数名称输入“func-vehicle-reg”。

      所属应用选择默认的“default”。

      委托名称选择 创建委托中创建的serverless,如 图1所示。
      图1 基础配置
    2. 输入代码信息

      运行时选择:Python 2.7

      函数执行入口选择使用系统默认,无需修改。

      代码上传方式选择“在线编辑”,输入以下代码,如图2所示。

        1
        2
        3
        4
        5
        6
        7
        8
        9
       10
       11
       12
       13
       14
       15
       16
       17
       18
       19
       20
       21
       22
       23
       24
       25
       26
       27
       28
       29
       30
       31
       32
       33
       34
       35
       36
       37
       38
       39
       40
       41
       42
       43
       44
       45
       46
       47
       48
       49
       50
       51
       52
       53
       54
       55
       56
       57
       58
       59
       60
       61
       62
       63
       64
       65
       66
       67
       68
       69
       70
       71
       72
       73
       74
       75
       76
       77
       78
       79
       80
       81
       82
       83
       84
       85
       86
       87
       88
       89
       90
       91
       92
       93
       94
       95
       96
       97
       98
       99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      # -*- coding:utf-8 -*-
      import json, re, random, base64
      import httplib, urllib, ssl
      from com.obs.client.obs_client import ObsClient
      from com.obs.models.put_object_header import PutObjectHeader
      from com.obs.models.get_object_header import GetObjectHeader
      from com.obs.models.get_object_request import GetObjectRequest
      from com.obs.response.get_result import ObjectStream
      from com.obs.models.server_side_encryption import SseKmsHeader,SseCHeader
      from com.obs.log.Log import *
      
      TEMP_ROOT_PATH = "/tmp/"
      region = 'cn-north-1'
      secure = True
      signature = 'v4'
      port = 443
      path_style = True
      
      def PostObject(obsAddr, bucket, objName, ak, sk):
      	TestObs = ObsClient(access_key_id=ak, secret_access_key=sk,
      			   is_secure=secure, server=obsAddr, signature=signature, path_style=path_style, region=region,ssl_verify=False, port=port,
      			   max_retry_count=5, timeout=20, chunk_size=65536)
      
      	Lheaders = PutObjectHeader(md5=None, acl='private', location=None, contentType='text/plain')   
      	
      	objPath = TEMP_ROOT_PATH + objName
      	resp = TestObs.postObject(bucketName=bucket, objectKey=objName, file_path=objPath, headers=Lheaders)
      
      	if isinstance(resp, list):
      		for k, v in resp:
      			print('PostObject, objectKey',k, 'common msg:status:', v.status, ',errorCode:', v.errorCode, ',errorMessage:', v.errorMessage)
      	else:
      		print('PostObject, common msg: status:', resp.status, ',errorCode:', resp.errorCode, ',errorMessage:', resp.errorMessage)
      
      def post(host, url, token, body, expect=200):
      	headers = {'Content-Type': 'application/json', 'X-Auth-Token': token}
      	body = json.dumps(body)
      	conn = httplib.HTTPSConnection(host, context=ssl._create_unverified_context())
      	conn.request("POST", url, body, headers)
      	response = conn.getresponse()
      	data = response.read()
      	if response.status != expect:
      		raise Exception(
      			"publish failed with status:", response.status,
      			", expecting: ", expect, 
      			", reason:", response.reason,
      			", data:", data)
      	return data
      	
      def createTopic(userId, context):
      	token = context.getToken()
      	projectId = context.getProjectID()
      	
      	body = {
      		"name": "vehicle_" + userId + "_notifications"
      	}
      	data = post(
      		'smn.cn-north-1.myhwclouds.com', 
      		'/v2/' + projectId + '/notifications/topics',
      		token, body, expect=201,
      	)
      	ret = json.loads(data)
      	return ret['topic_urn']
      
      def createSub(topicUrn, contact, context):
      	token = context.getToken()
      	projectId = context.getProjectID()
      	
      	body = {
      		"protocol": context.getUserData('protocol'),
      		"endpoint": contact
      	}
      	data = post(
      		'smn.cn-north-1.myhwclouds.com', 
      		'/v2/' + projectId + '/notifications/topics/' + topicUrn + '/subscriptions',
      		token, body, expect=201,
      	)
      	return 
      
      def tranformAPIGEvent(event):
      	print event
      	body = base64.b64decode(event["body"])
      	print body
      	event = json.loads(str(body))
      	return event
      
      def handler (event, context):
      	event = tranformAPIGEvent(event)
      	userId = str(random.randint(100000000000000,999999999999999))
      	contact = event["contact"]
      	topicUrn = createTopic(userId, context)
      	createSub(topicUrn, contact, context)
      	
      	obsAddress = context.getUserData('obs_address') 
      	if obsAddress is None:
      		obsAddress = '100.125.15.200'
      	ak = context.getAccessKey()
      	sk = context.getSecretKey()
      	obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=obsAddress, signature=signature, path_style=path_style)
      	
      	bucketName = context.getUserData('vehicle_list_bucket_prefix') + event["city_name"]
      	objName = userId
      	
      	f = open(TEMP_ROOT_PATH + objName, "w+")
      	f.write(contact)
      	f.close()
      	
      	PostObject (obsAddress, bucketName, objName, ak, sk)
      	
      	jsonResponse = {
      		'statusCode': 200,
      		'isBase64Encoded': True,
      		'headers': {
      			"Content-type": "application/json",
      	"Access-Control-Allow-Origin" : "*", 
      		},
      		'body': base64.b64encode(json.dumps({
      			"vehicle_id": userId 
      		})),
      	}
      	return json.dumps(jsonResponse)
      
      图2 代码配置
    3. 单击右侧“创建函数”,完成函数创建。

  3. 进入函数详情页,在“代码”页签,依赖代码包中输入2中获取的obs链接地址,如图3所示。

    图3 依赖代码包

  4. 在“配置”页签,输入环境配置信息。

    内存选择“512”,超时输入“200”,

    环境变量输入protocol:sms;vehicle_list_bucket_prefix:vehicle-list-,如图4所示。

    图4 环境配置

    protocol为配送员提供的联系方式的种类。 vehicle_list_bucket_prefix是obs桶1和桶2名称的共同前缀。

  5. 单击页面右上角“保存”,保存配置信息。
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区