我目前正在使用Amazon的API网关创建一个直接与DynamoDB交互的REST API(使用“ AWS服务”集成类型-中间没有lambda)。一切正常,除了我想在第一个响应上返回Set-Cookie标头,以用于随后对API的调用。
为简单起见(这里不考虑安全性),我想使用context.requestId作为 cookie的值。问题在于Set-Cookie标头不仅需要cookie的值,还需要更多的信息。至少它还需要Cookie的名称,形式为CookieName=CookieValue
,实际上,我还想为其设置其他参数,例如到期日期。
但是,似乎无法结合在“标题映射值”中包含一些静态文本的上下文变量,因为我需要上述格式:https://docs.aws.amazon.com/apigateway/latest/developerguide/request-response-data-mappings.html#mapping-response-parameters
所以我的问题是:我可以在“标题映射值”框中添加任何内容来实现此行为吗?与'id='+context.requestId
相似,但有效吗?我也愿意使用其他设置方法,例如AWS CLI或导入OpenAPI文件。
答案 0 :(得分:0)
对于“映射值”,请使用以下格式之一:
integration.response.header。标题名称,其中 header-name 是后端的单值响应标题的名称。例如,要返回后端响应的
Date
标头作为API方法响应的Timestamp
标头,响应标头列将包含一个 Timestamp 条目,并且关联的映射值应该设置为 integration.response.header.Date 。 ...
因此,以上内容归结为 DynamoDB 支持的内容。然后通过查看文档https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html#API_GetItem_ResponseElements
中的 GetItem 这样的API示例之一HTTP/1.1 200 OK
x-amzn-RequestId: <RequestId>
x-amz-crc32: <Checksum>
Content-Type: application/x-amz-json-1.0
Content-Length: <PayloadSizeBytes>
Date: <Date>
{ response json excluded for brevity}
所以我可能会尝试在映射中使用x-amzn-RequestId
标头值
integration.response.header.x-amzn-RequestId
其他响应可能不包含此标头,但在这种情况下,有可能启用请求跟踪,最终将回吐X-Amzn-Trace-Id
header
AWS response param mapping docs提到了映射可用的语法:
+--------------------------------------+------------------------+
| Mapped Data Source | Mapping expression |
+--------------------------------------+------------------------+
| Integration response header | integration.response.header.PARAM_NAME |
| Integration response header | integration.response.multivalueheader.PARAM_NAME |
| Integration response body | integration.response.body |
| Integration response body (JsonPath) | integration.response.body.JSONPath_EXPRESSION |
| Stage variable | stageVariables.VARIABLE_NAME |
| Context variable | context.VARIABLE_NAME that must be one of the supported context variables. |
| Static value | 'STATIC_VALUE'. The STATIC_VALUE is a string literal and must be enclosed within a pair of single quotes. |
+--------------------------------------+------------------------+
我们还知道PARAM_NAME
需要与同一文档页面上的正则表达式^[a-zA-Z0-9._$-]+$
相匹配。
尽管没有显示连接的示例,所以即使支持'id='+context.requestId
语法,也没有阻止其将来删除的东西。
API网关使用Velocity Template Language (VTL)引擎为集成请求和集成响应处理正文映射模板。映射模板将方法请求有效负载转换为相应的集成请求有效负载,并将集成响应主体转换为方法响应主体。
关于AWS的指南-Use a Mapping Template to Override an API's Request and Response Parameters and Status Codes
模板可能类似于以下内容。我还没有测试过:
#set($cookieName = "id")
#set($cookieNameValSeparator = "=")
$input.json("$")
#set($context.responseOverride.header.Set-Cookie = "$cookieName$cookieNameValSeparator$context.requestId")
答案 1 :(得分:0)