如何为一个 Google 云函数设置多个 API 端点?
How can I have multiple API endpoints for one Google Cloud Function?
我有一个 Google Cloud Function,它包含多个模块,可以在不同的路径上调用。
我正在使用无服务器框架来部署我的函数,但它有每个函数只有一个路径的限制。
我想在一个函数中使用多个路径,就像我们在 AWS 无服务器框架中一样。
假设一个 user
云函数有两条路径 /user/add
和 /user/remove
;两条路径都应调用相同的函数。
像这样:
serverless.yml
functions:
user:
handler: handle
events:
- http: user/add
- http: user/remove
如何为一个 GCF 设置多个 API 端点?
目前,在 google 中,每个函数仅支持一个事件定义。 For more
是的,确实没有实际的 REST 服务支持 Google Cloud Functions。它使用开箱即用的 HTTP 触发器。
为了快速解决问题,我使用我的请求负载来确定要执行的操作。在正文中,我添加了一个名为 "path"
.
的键
例如,考虑函数 USER。
添加用户:
{
"path":"add",
"body":{
"first":"Jhon",
"last":"Doe"
}
}
删除用户:
{
"path":"remove",
"body":{
"first":"Jhon",
"last":"Doe"
}
}
如果您的操作纯粹是 CRUD,您可以使用 request.method
,它提供 GET
、POST
、PUT
、DELETE
等动词来确定操作.
GCF 目前不支持函数内的路由。因此,解决方案取决于用例,但对于像问题中的示例这样的大多数简单情况,编写一个简单的路由器是一种不涉及更改正常请求格式的合理方法。
如果涉及参数或通配符,请考虑以route-parser
. A deleted answer suggested this app为例。
Express 请求对象有一些您可以利用的有用参数:
req.method
给出 HTTP 动词
req.path
给出没有查询字符串的路径
req.query
已解析键值查询字符串的对象
req.body
已解析的 JSON 正文
这里有一个简单的概念验证来说明:
const routes = {
GET: {
"/": (req, res) => {
const name = (req.query.name || "world");
res.send(`<!DOCTYPE html>
<html lang="en"><body><h1>
hello ${name.replace(/[\W\s]/g, "")}
</h1></body></html>
`);
},
},
POST: {
"/user/add": (req, res) => { // TODO stub
res.json({
message: "user added",
user: req.body.user
});
},
"/user/remove": (req, res) => { // TODO stub
res.json({message: "user removed"});
},
},
};
exports.example = (req, res) => {
if (routes[req.method] && routes[req.method][req.path]) {
return routes[req.method][req.path](req, res);
}
res.status(404).send({
error: `${req.method}: '${req.path}' not found`
});
};
用法:
$ curl https://us-east1-foo-1234.cloudfunctions.net/example?name=bob
<!DOCTYPE html>
<html lang="en"><body><h1>
hello bob
</h1></body></html>
$ curl -X POST -H "Content-Type: application/json" --data '{"user": "bob"}' \
> https://us-east1-foo-1234.cloudfunctions.net/example/user/add
{"message":"user added","user":"bob"}
如果您 运行 遇到 CORS and/or 预检问题,请参阅
您可以使用 Firebase 托管重写 URL。
在您的firebase.json文件中:
"hosting": {
"rewrites": [
{
"source": "/api/v1/your/path/here",
"function": "your_path_here"
}
]
}
请记住,这是一种解决方法,它有一个主要缺点:您将支付连击的费用。如果您的应用必须扩展,请考虑这一点。
我有一个 Google Cloud Function,它包含多个模块,可以在不同的路径上调用。
我正在使用无服务器框架来部署我的函数,但它有每个函数只有一个路径的限制。
我想在一个函数中使用多个路径,就像我们在 AWS 无服务器框架中一样。
假设一个 user
云函数有两条路径 /user/add
和 /user/remove
;两条路径都应调用相同的函数。
像这样:
serverless.yml
functions:
user:
handler: handle
events:
- http: user/add
- http: user/remove
如何为一个 GCF 设置多个 API 端点?
目前,在 google 中,每个函数仅支持一个事件定义。 For more
是的,确实没有实际的 REST 服务支持 Google Cloud Functions。它使用开箱即用的 HTTP 触发器。
为了快速解决问题,我使用我的请求负载来确定要执行的操作。在正文中,我添加了一个名为 "path"
.
例如,考虑函数 USER。
添加用户:
{
"path":"add",
"body":{
"first":"Jhon",
"last":"Doe"
}
}
删除用户:
{
"path":"remove",
"body":{
"first":"Jhon",
"last":"Doe"
}
}
如果您的操作纯粹是 CRUD,您可以使用 request.method
,它提供 GET
、POST
、PUT
、DELETE
等动词来确定操作.
GCF 目前不支持函数内的路由。因此,解决方案取决于用例,但对于像问题中的示例这样的大多数简单情况,编写一个简单的路由器是一种不涉及更改正常请求格式的合理方法。
如果涉及参数或通配符,请考虑以route-parser
. A deleted answer suggested this app为例。
Express 请求对象有一些您可以利用的有用参数:
req.method
给出 HTTP 动词req.path
给出没有查询字符串的路径req.query
已解析键值查询字符串的对象req.body
已解析的 JSON 正文
这里有一个简单的概念验证来说明:
const routes = {
GET: {
"/": (req, res) => {
const name = (req.query.name || "world");
res.send(`<!DOCTYPE html>
<html lang="en"><body><h1>
hello ${name.replace(/[\W\s]/g, "")}
</h1></body></html>
`);
},
},
POST: {
"/user/add": (req, res) => { // TODO stub
res.json({
message: "user added",
user: req.body.user
});
},
"/user/remove": (req, res) => { // TODO stub
res.json({message: "user removed"});
},
},
};
exports.example = (req, res) => {
if (routes[req.method] && routes[req.method][req.path]) {
return routes[req.method][req.path](req, res);
}
res.status(404).send({
error: `${req.method}: '${req.path}' not found`
});
};
用法:
$ curl https://us-east1-foo-1234.cloudfunctions.net/example?name=bob
<!DOCTYPE html>
<html lang="en"><body><h1>
hello bob
</h1></body></html>
$ curl -X POST -H "Content-Type: application/json" --data '{"user": "bob"}' \
> https://us-east1-foo-1234.cloudfunctions.net/example/user/add
{"message":"user added","user":"bob"}
如果您 运行 遇到 CORS and/or 预检问题,请参阅
您可以使用 Firebase 托管重写 URL。
在您的firebase.json文件中:
"hosting": {
"rewrites": [
{
"source": "/api/v1/your/path/here",
"function": "your_path_here"
}
]
}
请记住,这是一种解决方法,它有一个主要缺点:您将支付连击的费用。如果您的应用必须扩展,请考虑这一点。