Amazon web services 如何在AWS API网关中生成集Cookie集成响应头?

Amazon web services 如何在AWS API网关中生成集Cookie集成响应头?,amazon-web-services,cookies,http-headers,aws-api-gateway,api-gateway,Amazon Web Services,Cookies,Http Headers,Aws Api Gateway,Api Gateway,我目前正在使用Amazon的API网关创建一个与DynamoDB直接交互的REST API(使用“AWS服务”集成类型-两者之间没有lambda)。一切都正常,除了我想在第一个响应中返回一个Set-Cookie头,以用于对API的后续调用 为了简单起见(这里不考虑安全性),我想使用context.requestId作为cookie的值。问题是,设置Cookie头需要的不仅仅是Cookie的值;至少,它还需要cookie的名称,格式为CookieName=CookieValue,实际上,我还想为它

我目前正在使用Amazon的API网关创建一个与DynamoDB直接交互的REST API(使用“AWS服务”集成类型-两者之间没有lambda)。一切都正常,除了我想在第一个响应中返回一个Set-Cookie头,以用于对API的后续调用

为了简单起见(这里不考虑安全性),我想使用context.requestId作为cookie的值。问题是,设置Cookie头需要的不仅仅是Cookie的值;至少,它还需要cookie的名称,格式为
CookieName=CookieValue
,实际上,我还想为它设置其他参数,比如过期日期

但是,似乎没有办法将上下文变量与“标题映射值”中的一些静态文本相结合,因为我需要上述格式:

因此,我的问题是:我是否可以在“header-mapping-value”框中输入任何内容来获得此行为?类似于
'id='+context.requestId
的内容,但有效?我也愿意使用其他设置方法,如AWS CLI或导入OpenAPI文件

供参考,这是有问题的API网关输入框:

简单标题映射 第页上关于响应>标题映射>映射值的AWS文档

对于映射值,请使用以下格式之一:

integration.response.header.header-name,其中header name是来自后端的单值响应头的名称。例如,要将后端响应的
Date
头作为API方法响应的
Timestamp
头返回,响应头列将包含一个Timestamp条目,并且相关的映射值应设置为integration.response.header.Date

因此,上面的内容可以归结为DynamoDB所支持的内容。通过查看其中一个API示例,如文档中的GetItem

其他响应可能不包含此头,但在这种情况下,可以启用请求跟踪,这将导致返回

还有什么可以映射 提及映射的可用语法:

+--------------------------------------+------------------------+
| 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.\u$-]+$

即使支持
'id='+context.requestId
语法,也没有示例显示连接。没有任何东西可以阻止将来删除它。

另一种选择是映射模板 API网关使用引擎处理集成请求和集成响应的主体映射模板。映射模板将方法请求有效载荷转换为相应的集成请求有效载荷,并将集成响应体转换为方法响应体

有一个AWS指南-

模板可以类似于下面的内容。但我还没有测试过:

#set($cookieName = "id")
#set($cookieNameValSeparator = "=")
$input.json("$")
#set($context.responseOverride.header.Set-Cookie = "$cookieName$cookieNameValSeparator$context.requestId")


如果您对使用AWS CloudFront感兴趣,这将使这变得非常简单。在CloudFront中,您可以添加自己的带有名称和值的自定义标题,因为请求的路由是针对您的站点的最佳路由:


希望这有帮助

这是将请求id放入Set-Cookie标头的另一种方法,就像我上面提到的,但是我仍然需要一种方法,除了请求id之外,还要向标头值添加静态文本,以使其成为有效的Set-Cookie标头。仅使用请求id作为值的Set Cookie标头不是有效的Cookie。我需要一个cookie名称,后面是头值中的请求id,例如
mycokiename=x-amzn-RequestId
@RyanHilbert提供了在类似情况下可以使用的更多细节,并且还提供了使用
映射模板的替代方法,因为文档不清楚是否允许连接。
+--------------------------------------+------------------------+
| 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. |
+--------------------------------------+------------------------+
#set($cookieName = "id")
#set($cookieNameValSeparator = "=")
$input.json("$")
#set($context.responseOverride.header.Set-Cookie = "$cookieName$cookieNameValSeparator$context.requestId")