云函数进阶:云函数URL化、集成响应、定时任务和云函数路由

2022-04-13 19:57:16 浏览数 (1)

云函数URL化

云函数并不是只能在uni-app中使用,我们完全可以脱离uni-app的环境来调用,这就需要用云函数URL化这个能力。把云函数给其他平台、环境的应用当成普通的http请求来访问。

开启URL化

打开uniCloud Web控制台,进入云函数管理页,点击云函数后的详情按钮

在云函数URL化区域里点击编辑按钮,在Path的输入框里输入/自定义路径,注意必须/开头

点击保存,然后复制这个URL化后的云函数的路径,将其粘贴到浏览器中,返回的数据会下载成一个.json文件,这就代表URL化成功了。

代码语言:javascript复制
https://5ccdce58-43fd-4ebf-b4d1-73664467bc69.bspapp.com/xcxcontact

自定义域名

不喜欢这个默认域名,也可以绑定自己的域名来访问,绑定的域名。URL 化后的云函数最大QPS为200,绑定自定义域名后最大QPS提升至2000。

申请https证书时通常会有下载选项,下载到证书之后找到对应Nginx的证书(包含一个crt文件和一个key文件或者一个pem文件和一个key文件),以文本形式打开crt/pem文件即可看到证书内容,同样的key文件对应着私钥。

填写域名证书且绑定成功后会返回一个CNAME域名,将绑定的域名配置CNAME记录值为此CNAME域名即可。

URL化云函数的入参

使用 HTTP 访问云函数时,HTTP 请求会被转化为特殊的结构体,称之为集成请求,结构如下:

代码语言:javascript复制
{
  path: 'HTTP请求路径,如 /hello',
  httpMethod: 'HTTP请求方法,如 GET',
  headers: {HTTP请求头},
  queryStringParameters: {HTTP请求的Query,键值对形式},
  body: 'HTTP请求体',
  isBase64Encoded: 'true or false,表示body是否为Base64编码'
}
  • 使用GET请求https://{云函数Url化域名}/{functionPath}?a=1&b=2,云函数接收到的event为
代码语言:javascript复制
{
  path: '/',
  httpMethod: 'GET',
  headers: {HTTP请求头},
  queryStringParameters: {a: "1", b: "2"},
  isBase64Encoded: false
}
  • 使用POST请求https://{spaceId}.service.tcloudbase.com/{functionPath},云函数接收到的event.body为请求发送的数据
代码语言:javascript复制
{
    path: '/',
    httpMethod: 'POST',
    headers: {
      ...
      "content-type": 'application/json'
    },
    isBase64Encoded: false,
    body: '{"a":1,"b":2}', // 注意此处可能是base64,需要根据isBase64Encoded判断
}

云函数URL化后的注意事项

  • 安全:为了保障业务安全性,开发者需在代码中做好权限控制和安全防护,避免未授权访问触发敏感操作。
  • 计费:云函数开启了URL化后,如果遇到大量恶意访问,消耗云函数资源,开发者可以将云函数访问地址设置为空即可停止 HTTP 访问支持。
  • 请求Body大小限制,不能超过1MB。响应Body大小限制,不能超过1MB。

云函数返回集成响应

云函数可以返回stringobjectnumber等类型的数据,或者返回集成响应,随后云接入会将返回值转化为正常的 HTTP 响应。

返回字符串或数字

云函数返回字符串

代码语言:javascript复制
exports.main = function() {
  return 'hello gateway';
}

那么最终 HTTP 响应为:

代码语言:javascript复制
HTTP/1.1 200 OK
date: Mon, 16 Dec 2019 08:35:31 GMT
content-type: text/plain; charset=utf-8
content-length: 13

hello gateway

返回 Object

返回的Object会被转换为 JSON,同时 HTTP 响应的content-type会被设置为 application/json

代码语言:javascript复制
exports.main = function() {
  return {
    foo: 'bar'
  }
}

那么最终 HTTP 响应为:

代码语言:javascript复制
HTTP/1.1 200 OK
date: Mon, 16 Dec 2019 08:35:31 GMT
content-type: application/json; charset=utf-8
content-length: 13

{"foo":"bar"}

返回集成响应

云函数可以返回如下这样特殊结构的集成响应,来自由地控制响应体:

代码语言:javascript复制
{

  "mpserverlessComposedResponse": true, // 使用返回集成响应是需要此字段为true
  "isBase64Encoded": true,
  "statusCode": 200,
  "headers": { 
    "headerName": "headerValue", 
    ... 
   },
  "body": "..."
}

比如我们希望云函数直接返回一个图片数据

那么可以将isBase64Encoded设置为true,并且将二进制文件内容转为 Base64 编码的字符串,例如:

代码语言:javascript复制
exports.main = function() {
  return {
    mpserverlessComposedResponse: true, // 使用返回集成响应是需要此字段为true
    isBase64Encoded: true,
    statusCode: 200,
    headers: {
      'content-type': 'image/png'
    },
    body: 'iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAY...'
  }
}

最终 HTTP 响应为一张 PNG 图片:

代码语言:javascript复制
HTTP/1.1 200 OK
date: Mon, 16 Dec 2019 08:35:31 GMT
content-type: image/png
content-length: 9897

<binary payload...>

在某些特殊情况我们要下载图片但又无法将域名设置到download白名单时,就可以用云函数来中转。在下一节实战课程中我们会学习到这个技巧。

定时任务

云函数可以配置定时触发器,配置后的云函数会在相应的时间点被触发。在uniCloud web控制台找到需要配置定时触发器的云函数,点击详情按钮

编辑创建云函数触发器,格式如下:

代码语言:javascript复制
["cron:0 0 * * * *"]

Cron 表达式有七个字段,按空格分隔。其中,每个字段都有相应的取值范围:

排序

字段

通配符

第一位

0 - 59的整数

, - * /

第二位

分钟

0 - 59的整数

, - * /

第三位

小时

0 - 23的整数

, - * /

第四位

1 - 31的整数(需要考虑月的天数)

, - * /

第五位

1 - 12的整数或 JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV和DEC

, - * /

第六位

星期

0 - 6的整数或 MON、TUE、WED、THU、FRI、SAT和SUN,其中0指星期一,1指星期二,以此类推

, - * /

第七位

1970 - 2099的整数(不支持第七位)

, - * /

下面列举一些 Cron 表达式和相关含义:

代码语言:javascript复制
// 需要注意的是不支持第七位,请自行去除代表年的位置
*/5 * * * * * * 表示每5秒触发一次
0 0 2 1 * * * 表示在每月的1日的凌晨2点触发
0 15 10 * * MON-FRI * 表示在周一到周五每天上午10:15触发
0 0 10,14,16 * * * * 表示在每天上午10点,下午2点,下午4点触发
0 */30 9-17 * * * * 表示在每天上午9点到下午5点内每半小时触发
0 0 12 * * WED * 表示在每个星期三中午12点触发

注意事项:

  • 定时触发器限制为最高频率每小时触发一次,要求cron表达式中的秒和分仅支持配置固定的数字,不支持特殊字符。
  • 的cron表达式为6位,腾讯云为7位。相比腾讯缺少代表年份的第7位。
  • 定时触发的时间使用的是utc 8的时区。
  • 定时执行的时间选在较为常见集中的时刻会低概率出现执行失败的情况。建议避免整点(特别是0点),错开定时触发高峰期进行执行。

云函数路由

一个云服务空间里最多只能有48个云函数,当然对大部分的项目而言,这个数量是够用的。通过云函数的路由模式我们可以极大地节省云函数的使用数量。

其实所谓云函数路由,就是通过在云函数中通过定义一个参数来匹配的指定的功能模块,下面是一个云函数单一路由的简单示例:

代码语言:javascript复制
'use strict';
exports.main = async (event, context) => {
  //event为客户端上传的参数
  console.log('event : ', event)
  
  if(!event.controller||!event.action)return "云函数参数不正确";
  
  const controller = require('./controllers/'   event.controller);
  
  return controller[event.action](event.data);
};

路由模块

代码语言:javascript复制
function action1(parms){
  
}

module.exports = {
  action1
}

前端调用

代码语言:javascript复制
uniCloud.callfunction({
  name:"router",
  data:{
    controller:"user",
    action:"action1",
    data:{
      
    }
  }
});

注意事项:

多路由的话可以节省云函数数量,把所有请求都合并到一个云函数中。由于高频次的使用带来的缓存,也可以节省云函数冷启动的次数。但是多个请求到同一个云函数的话,也会占用单个云函数的并发极限。

小结

在本节中我们学习的云函数URL化非常有用。这可以让我们的uniCloud云函数方便的被其他环境调用,我甚至做过项目只用uniCloud云开发,前端是使用Flutter来做的。用好URL化,会极大的拓展云函数的使用场景。

0 人点赞