您能否解释如何设置Amazon AWS API Gateway以根据请求HTTP Accept标头返回不同的文档?
两个例子:
curl --request GET'http://api.sample.com/v1/hello' - 标题'接受:text / HTML'
<html><body>Hello, World!</body></html>
curl --request GET'http://api.sample.com/v1/hello' - 标题'接受:application / JSON'
{data:"Hello, World!"}
答案 0 :(得分:1)
如果您希望API网关充当模板呈现引擎,我认为这不会起作用,但您可以通过将Accept标头传递给Lambda并让Lambda知道您的Lambda知道请求者正在寻找哪种内容类型决定返回什么。
对于要支持的每个Content-Type(请求者正在发送的数据),您将需要一个映射模板(在方法执行 - &gt;集成请求 - &gt;映射模板下)。
一个示例映射模板,它接收来自请求的输入并将其转换为JSON event
,以便Lambda可以使用它:
{
"headers": {
// maybe there is an easier way for Lambda to get this but I couldn't find it in the context object so I believe APIG needs to send it like this
"Accept": "$input.params('Accept')"
},
"message": "$input.params('message')"
}
然后在你的lambda中你可以检查Accept标头并根据它发回一个响应:
module.exports.handler = function(event, context) {
var msg = event.message.toUpperCase()
if(event.headers.Accept === 'text/html') {
return context.succeed('<html><body><h1>Transformed Message: ' + msg + '</h1></body></html>');
}
// all other requests get JSON...
context.succeed({transformedMessage: msg});
};
最后一步回到API网关 - 在方法执行下 - &gt;方法响应 - &gt;添加响应。模型可以为空,但将Content-Type设置为text/html
。这将告诉API网关让您从Lambda发回的任何内容传递给任何Accept:text / html
编辑:这个答案假设您使用Lambda作为后端,但实际上同样的想法可以应用于您正在使用的几乎任何后端服务。