之前使用腾讯云函数作为喝水提醒以及自动化打卡提醒/执行,微信刷步等操作,但是云函数最赞的其实是作为一个独立的api来使用。
因为一开始搞不明白,想要在云函数上部署一个fastapi 作为接口来接受请求参数,处理请求并返回json数据。因为文档看的不够仔细,导致走了很多的弯路。
其实单函数,使用api网关触发器即可实现一个web api的服务,并不需要使用http server来作为服务支撑。
函数入参
如果作为api来使用,定义的函数肯定是要接受外部参数的,函数入参就是函数在被触发调用时所传递给函数的内容。
event入参
参数类型为dict
。将event
入参传递给执行方法,实现代码与触发函数(event)交互。
- 云函数被其他应用程序调用时,您可以在调用方和函数代码之间自定义一个
dict
类型的参数。调用方按照定义好的格式传入数据,函数代码按格式获取数据。
例如,定义一个dict
类型的数据结构{"key":"XXX"}
,当调用方传入数据{"key":"abctest"}
时,函数代码可以通过event[key]
来获得值abctest
。
context入参
将context入参传递给执行方法,代码将通过context
入参对象。
1 |
|
Python 环境下的入参包括 event 和 context,两者均为 Python dict 类型。
- event:使用此参数传递触发事件数据。
- context:使用此参数向您的处理程序传递运行时信息。
安装依赖
在安装依赖这个地方碰见的坑比较多,当时只需要安装requests-html
这个module,但是这个module本身在安装以及调用中也需要依赖多个modules。在lib site-package中单纯的将这个module上传到云函数,会抛出多个modules 异常。
解决方案,将当前环境下所有的依赖包的包文件夹上传到函数的同级目录下。
Api 网关触发器
api网关触发器,可以将单函数作为web的后端接口服务,对外网提供服务。
集成请求与透传请求
在配置api 网关触发器的时候,默认是开启集成请求的。
集成请求,是指 API 网关会将 HTTP 请求内容,转换为请求数据结构;请求数据结构作为函数的 event 输入参数,传递给函数并进行处理。
透传请求,是指 API 网关会将 HTTP 请求的 body 内容作为函数的 event 输入参数传递给函数,透传请求目前还处于规划过程中。对于透传请求,要求 HTTP 请求的 body 内容为 JSON 数据结构内容。
当您需要将图片或文件通过 API 网关传入云函数时,需要将图片或文件进行 Base64 编码。
API 网关触发器的集成请求事件消息结构
在 API 网关触发器接收到请求时,会将类似以下 JSON 格式的事件数据发送给绑定的云函数。
1 |
|
数据结构内容详细说明如下:
结构名 | 内容 |
---|---|
requestContext | 请求来源的 API 网关的配置信息、请求标识、认证信息、来源信息。其中:serviceId,path,httpMethod 指向 API 网关的服务 ID、API 的路径和方法。stage 指向请求来源 API 所在的环境。requestId 标识当前这次请求的唯一 ID。identity 标识用户的认证方法和认证的信息。sourceIp 标识请求来源 IP。 |
path | 记录实际请求的完整 Path 信息。 |
httpMethod | 记录实际请求的 HTTP 方法。 |
queryString | 记录实际请求的完整 Query 内容。 |
body | 记录实际请求转换为 String 字符串后的内容。 |
headers | 记录实际请求的完整 Header 内容。 |
pathParameters | 记录在 API 网关中配置过的 Path 参数以及实际取值。 |
queryStringParameters | 记录在 API 网关中配置过的 Query 参数以及实际取值。 |
headerParameters | 记录在 API 网关中配置过的 Header 参数以及实际取值。 |
这个如果仅仅看json的话可能不太好了解,比如我构建了一个GET请求的api网关触发器,在url中传递参数给函数,url?param=2021 ,如果需要在函数中拿到2021这个参数。需要解析event。
当请求网关接口时候,这样就会将 ‘2021’ 返回。
跨域请求
如果发现请求时候,在network面板中看到 Missing allow cros header,说明网关的跨域请求是关闭的。
需要到触发器中找到api网关,开启跨域请求。
- 本文标题:腾讯云函数踩坑记录
- 本文作者:Roy
- 创建时间:2021-03-10 13:45:30
- 本文链接:https://www.yrzdm.com/2021/03/10/tencent-scf/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!