HTTP 访问云函数
通过配置 HTTP 访问服务,你可以让云函数像普通的 Web API 一样响应 HTTP 请求。在通过 HTTP 访问服务对接云函数时,可以支持对接普通云函数和 HTTP 云函数。
普通云函数
开发者可以通过 HTTP 调用普通云函数,并且将云函数的返回值变为 HTTP 响应体。云开发中普通云函数的入出参一般都要求是 JSON 对象,需要一定的映射规则对应到 HTTP 的请求和响应中。
工作原理
当你通过 HTTP 请求访问云函数时:
- 请求转换:HTTP 请求会被自动转换成特定的 JSON 格式传给云函数
- 响应转换:云函数的返回值会被转换成标准的 HTTP 响应返回给客户端
跨域配置
HTTP 访问服务天然支持跨域请求。只需要将你的域名添加到 云开发平台/环境配置/安全域名 中,该域名下的网页就可以正常访问你的云函数了。
云函数如何接收 HTTP 请求
请求参数格式
当你发送 HTTP 请求到云函数时,云函数会收到一个包含所有请求信息的对象,我们称之为集成请求:
{
path: 'HTTP请求路径,如 /hello',
httpMethod: 'HTTP请求方法,如 GET、POST',
headers: {
// HTTP请求头信息
},
queryStringParameters: {
// URL查询参数,如 ?name=value
},
requestContext: {
// 云开发环境相关信息
},
body: 'HTTP请求体内容',
isBase64Encoded: 'true/false,表示body是否为Base64编码'
}
实际示例
假设你发送了一个 GET 请求到 https://env-id.service.tcloudbase.com/,云函数会收到这样的参数:
{
path: '/',
httpMethod: 'GET',
headers: {
'host': 'env-id.service.tcloudbase.com',
'connection': 'close',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8'
},
requestContext: {
requestId: 'cdbb96328072184d19d3fcd243e8cc4d',
envId: 'env-id',
appId: 123456789,
uin: 123456789
},
isBase64Encoded: false,
body: ''
}
云函数如何返回 HTTP 响应
云函数有多种方式返回数据,系统会自动将这些返回值转换成标准的 HTTP 响应。
方式一:直接返回简单数据
返回字符串或数字
最简单的方式,直接返回字符串:
exports.main = async function() {
return "hello gateway";
};
客户端会收到这样的 HTTP 响应:
HTTP/1.1 200 OK
content-type: text/plain; charset=utf-8
hello gateway
返回 JSON 对象
返回对象时,会自动转换为 JSON 格式:
exports.main = async function() {
return {
foo: "bar",
message: "success"
};
};
客户端会收到:
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
{"foo":"bar","message":"success"}
方式二:返回集成响应(高级用法)
如果你需要精确控制 HTTP 响应的状态码、响应头等信息,可以返回特殊格式的集成响应:
{
"isBase64Encoded": true|false, // body是否为Base64编码
"statusCode": 200, // HTTP状态码
"headers": { // 自定义响应头
"headerName": "headerValue"
},
"body": "响应内容" // 响应体
}
示例1:返回 HTML 页面
exports.main = async function() {
return {
statusCode: 200,
headers: {
"content-type": "text/html",
},
body: "<h1>欢迎访问我的网站</h1><p>这是通过云函数返回的HTML页面</p>",
};
};
浏览器会直接显示这个 HTML 页面。
示例2:返回 JavaScript 文件
exports.main = async function() {
return {
statusCode: 200,
headers: {
"content-type": "application/javascript",
},
body: 'console.log("Hello from 云函数!");',
};
};
示例3:返回图片等二进制文件
对于图片、音视频等二进制文件,需要将内容转换为 Base64 编码:
exports.main = async function() {
return {
isBase64Encoded: true,
statusCode: 200,
headers: {
"content-type": "image/png",
},
body: "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAY...", // Base64编码的图片数据
};
};
客户端会收到一张完整的 PNG 图片。
示例4:实现页面重定向
你还可以返回 302 状态码来实现页面重定向:
exports.main = async function(event) {
const { path } = event;
return {
statusCode: 302,
headers: {
location: `https://tcb.cloud.tencent.com${path}`,
},
};
};
当用户访问你的云函数时,会被自动重定向到腾讯云开发官网的对应页面。
HTTP 云函数
由于 HTTP 云函数天然支持接收 HTTP 请求,因此 HTTP 访问服务会将请求直接转发至 HTTP 云函数进行处理。
HTTP 云函数中,服务在监听并接收 HTTP 请求后,直接进行请求处理并响应即可,无需类似普通云函数的集成响应处理。