我正在阅读Serverless上的这篇博客文章,介绍无服务器架构存在的不同模式。
我对services pattern
感兴趣,并想尝试一下。
在我的serverless.yml
文件中使用此配置。
functions:
apps:
handler: handler.apps
events:
- http: post apps
cors: true
- http: patch users
- http: get users
cors: true
- http: delete users
以下输出来自运行serverless deploy
。
POST - https://x7lpwa04.execute-api.us-west-2.amazonaws.com/staging/users
PATCH - https://x7lpwa04.execute-api.us-west-2.amazonaws.com/staging/users
GET - https://x7lpwa04.execute-api.us-west-2.amazonaws.com/staging/users
DELETE - https://x7lpwa04.execute-api.us-west-2.amazonaws.com/staging/users
现在如果我想获得一个资源,就可以使用CRUD服务,对于get
端点/staging/users/{id}
,我可能会有类似的东西。使用上述模式,是否要由用户传递像这样的/staging/users?id={id}
这样的查询字符串参数而不是像这样的/staging/users/{id}
这样的路径参数?是否可以使端点具有路径参数?
似乎无法以这种方式覆盖路径。
答案 0 :(得分:0)
您已经可以使用路径参数,例如:
{
"myFunction": {
"handler": "src/myFunction/index.index",
"description": "Does awesome things",
"events": [
{
"http": {
"path": "apiPath/{parameterOne}",
"method": "GET",
"integration": "lambda",
"request": {
"parameters": {
"parameterOne": true
},
"template": {
"application/json": "{ \"parameterOne\": \"$input.params(\"parameterOne\")\" }"
}
},
"response": {
"statusCodes": {
"200": {
"pattern": ""
},
"400": {
"pattern": "[\\s\\S]*\\[400\\][\\s\\S]*",
"template": "$input.path('$.errorMessage')"
},
"500": {
"pattern": "[\\s\\S]*(Process\\s?exited\\s?before\\s?completing\\s?request|\\[500\\])[\\s\\S]*",
"template": "$input.path('$.errorMessage')"
}
},
"headers": {
"Cache-Control": "'no-cache, no-store'",
"Pragma": "'no-cache'",
"Expires": "'0'",
"Strict-Transport-Security": "'max-age=31536000; includeSubdomains; preload'"
}
},
"cors": {
"origin": "*",
"headers": [
"Content-Type",
"Pragma",
"Cache-Control",
"X-Amz-Date",
"Authorization",
"X-Api-Key",
"X-Amz-Security-Token",
"X-Amz-User-Agent"
],
"allowCredentials": false
}
}
}
]
}
}
参数parameterOne
将映射到Lambda事件中。
答案 1 :(得分:0)
我可能会解释这种错误,但是至少在aws的情况下,您可以在lambda中添加一些资源。您将负责处理正确的行为,可以通过解析事件(如果存在的话)将填充路径参数来做到这一点。
如博客文章中所述
您可以通过解析代码中的事件主体来检查传入的HTTP请求的路径和方法,然后执行正确的操作以作为响应。就像在Lambda代码的开头有一个小型路由器一样。
您可以使用
指定一个更完整的事件 - http:
path: users/{id}
method: delete