EMAS Serverless云函数支持由HTTP请求触发云函数调用的功能,本文介绍如何开启云函数HTTP触发功能。
当开启某一函数的HTTP触发功能后,只要使用HTTP请求就可以访问到函数,开发者需要关注业务安全和资源安全。
业务安全:开发者需在云函数代码中做好权限控制和安全防护,避免未授权访问触发敏感操作。
资源安全:云函数开启了HTTP访问后,如果遇到大量恶意访问,消耗云函数资源,开发者可以将云函数的触发路径设置为空或关掉该服务空间的HTTP触发功能,停止HTTP触发支持。
开启方法
开启云函数HTTP触发功能,您需要开启Space的触发功能且配置云函数的HTTP触发路径。
开启Space的HTTP触发功能
登录EMAS管理控制台。
查找您的项目,单击项目,进入EMAS概览页。
在顶部导航栏,选择平台服务。
在左侧导航栏,选择。
在界面右上角选择当前服务空间,如emasDev。
单击HTTP触发配置页签,将HTTP触发设置右侧的更改状态设置为开启。系统会为开启HTTP触发功能的Space分配一个默认域名
(DefaultEndpoint)
,供HTTP触发使用。
开启云函数的HTTP触发功能
返回控制台主页,单击云函数列表页签。
选择任意一个云函数,单击函数名称,如test。打开云函数页面。
选择触发页签,单击HTTP路径触发右侧的编辑按钮。
在编辑云函数页面,填写触发路径。如下图所示。
HTTP触发函数执行
用户访问
https://${DefaultEndpoint}${HttpTriggerPath}
,即可触发对应的云函数执行。
限制说明
请求路径不能以
/
结尾,同一个Space下面的云函数的请求路径不能重复,请求路径只支持(/)、(-)、(_)、(.)、字母和数字组合,请求路径最长不超过128个字符。请求方法仅支持以下四种,其余方法会被忽略。
GET
POST
PUT
DELETE
请求时Body的Content-Type仅支持以下三类,允许没有Body的请求,即没有Content-Type。其余Content-Type类型会被拒绝。
application/json
application/x-www-form-urlencoded
text/*
通过HTTP触发的响应,都会添加固定的Header,即
Content-Disposition: attachment
,此字段会使得返回结果在浏览器中以附件的方式下载。当前此字段无法覆盖,后续支持使用自定义域名之后,可以避免该问题。请求Body大小限制,不能超过1M。
响应Body大小限制,不能超过1M。
云函数入参说明
在云函数中,通过ctx.args
来获取请求时的内容。各参数的详细解释如下:
{
path: 'HTTP请求路径,如 /hello',
httpMethod: 'HTTP请求方法,如 GET',
headers: {HTTP请求头,键值对形式},
queryStringParameters: {HTTP请求的Query,键值对形式},
body: 'HTTP请求体',
isBase64Encoded: 'true or false,表示body是否为Base64编码,当前只会有false'
}
云函数返回值说明
云函数返回时,可以返回string、object、number、boolean等类型的数据,或者返回自定义响应,随后小程序Serverless会将返回值转化为正常的HTTP响应。
返回string
当服务端返回的Content-Type是text/plain。
例如云函数返回:
'hello world!'
则最终的响应为:
HTTP/2 200 date: Mon, 23 Mar 2020 10:12:41 GMT content-type: text/plain content-length: 12 content-disposition: attachment request-id: ac14000d1584958361033101870 hello world!
返回object、number或boolean
当服务端返回的Content-Type是application/json。
例如云函数返回:
{ "keyString": "value1", "keyNumber": 1234 }
则最终的响应为:
HTTP/1.1 200 OK Date: Mon, 23 Mar 2020 10:18:48 GMT Content-Type: application/json; charset=utf-8 Content-Length: 39 request-id: ac14000d1584958728277106170 content-disposition: attachment {"keyString":"value1","keyNumber":1234}
返回自定义响应
服务端返回的Content-Type,HttpStatusCode,Headers都由云函数来指定。
要求云函数返回一个object,同时要设定mpserverlessComposedResponse为true。
云函数的返回格式如下:
{ "mpserverlessComposedResponse": true, "isBase64Encoded": true|false, "statusCode": httpStatusCode, "headers": { "headerName": "headerValue", ... }, "body": "..." }
例如云函数返回:
{ mpserverlessComposedResponse: true, isBase64Encoded : false, statusCode: 200, headers: { 'content-type': 'text/html' }, body: '<h1>Hello World</h1>' }
则最终的响应为:
HTTP/2 200 date: Mon, 23 Mar 2020 10:40:09 GMT content-type: text/html; charset=utf-8 content-length: 20 request-id: ac14000d1584960009970137070 content-disposition: attachment <h1>Hello World</h1>