我使用 Serveless 框架 1.5。
使用"lambda-proxy 集成",修改响应标头/正文/状态代码非常容易。
callback(null, {
status: 200,
headers: {
'STRING_VALUE': 'STRING_VALUE'
},
body: 'STRING_VALUE'
});
但是我想使用path_info值,所以我使用serverless.yml,如下所示:
functions:
hello:
handler: handler.hello
events:
- http:
path: hello/{hi}
method: get
integration: lambda
request:
parameters:
paths:
hi: true
要获得path_info设置必须使用"lambda 集成"。但我也想修改响应的响应标头/正文/状态代码。我应该如何设置以使用"lambda 集成"修改这些响应值?
问候
==后记==
提交问题后,我找到了文档:https://serverless.com/framework/docs/providers/aws/events/apigateway/#lambda-integration
据此,身体可以定制:
response:
headers:
Content-Type: "'text/html'"
template: $input.path('$')
但是,对于响应标头,文档说:
response:
headers:
Content-Type: integration.response.header.Content-Type
Cache-Control: "'max-age=120'"
我使设置与上面相同,代码处理程序.js如下所示:
callback(null, {
header: {'Content-Type': 'image/png'}
});
尽管标题content_type没有变成"图像/PNG"。如何动态修改响应标头?
我自己找到了问题的答案:
要更改标头,serverless.yml 设置必须为:
response:
headers:
Content-Type: "integration.response.body.headers.Content-Type"
template: $input.path('$.body')
响应代码必须是:
callback(null, {
headers: {'Content-Type': 'image/jpeg'},
body: body
});
一个令人困惑的点是,"响应模板中的$"和"header映射设置中的integration.response.body"是相同的含义。
因此,"$.body"与"integration.response.body.body"相同。
要更改状态代码,我们应该使用错误对象。
const status = err ? new Error('[404] Not found') : null;
callback(status, {
headers: {'Content-Type': 'image/jpeg'},
body: body
});
要获得path_info设置必须使用"lambda 集成"。
您可以使用以下方法使用 Lambda 代理集成访问路径参数:
event["pathParameters"]["id"]
请记住先检查event["pathParameters"] !== null
是否有可能在没有任何路径参数的情况下调用您的 Lambda。