AWS API Gateway Mapping Template 获取IP, header等
API Gateway暂时没有详细的中文文档,翻译无能的我实在不知道Mapping Template应该翻译成什么比较好。
适用场景
在配合API Gateway和Lambda来搭建RESTful API时,Lambda获取的payload并非通常服务器端获取的一个request对象,lambda获取到的payload并不包含 request header的内容,而只有request body的内容。
header中的部分内容可以通过API Gateway提供的变量从mapping template中获取。可以获取的内容包括IP, http方法,路由参数,query等,具体可以看文档^1
设置方法
按照理论来说,AWS设置可以通过界面设置的都可以通过脚本来设置。下面只介绍在界面中的设置:
- 在API Gateway界面中选中具体的api方法,点击右侧的Intergration Request
- 在底部点击Mapping Templates
- 点击Add Mapping Template,输入
application/json
,点击√进行确认 - 在右侧新出现的区域,点击编辑按钮(铅笔图标),输入需要的变量即可,例如要获取ip:
1
2
3
4{
"body": $input.json('$'),
"source_ip" : "$context.identity.sourceIp",
}
其中$input.json('$')
是请求时客户端发来的body
response header和cookie
在配合使用lambda和API gateway的时候,header和cookie是非常令人头疼的问题…
lambda返回的内容,只是response body,因此设置header要在api gateway中进行,并且也是有一些限制的:
- 在API Gateway界面中选中具体的api方法,点击右侧的Method Response
- 展开HTTP Status,点击Add Header,添加一个header。
注意:可以添加多个Header,但这些header不能同名,这也就意味着,只能有一个
Set-Cookie
,只能添加一个cookie - 完成以上步骤后,返回第一步所在的页面,点击Integration Response,点击三角展开,会看到Header Mappings
- 在对应的位置编辑mapping value
- 如果想使用lambda返回的数据,设置为
integration.response.body.KEY
- 如果不是使用lambda(即把gateway用作代理),而是使用实际服务器返回的header,设置为
integration.response.header.KEY
- 如果想使用lambda返回的数据,设置为