【问题标题】:Map multiple http response headers in AWS API Gateway with AWS Lambda response body使用 AWS Lambda 响应正文映射 AWS API Gateway 中的多个 http 响应标头
【发布时间】:2016-12-15 08:48:12
【问题描述】:

我可以通过api gateway集成响应头映射设置单个http响应头。
在那种情况下,我给出了来自 aws lambdacontext.fail("http://www.google.com") 响应,并使用正则表达式(“.http.”)来识别响应并最终将其映射到我的标头,如下所示
Location: integration.response.body.errorMessage
当我尝试一次映射一个标头时,这是有效的。
但我想在一个响应中同时设置 Location 和 Cookie 标头。 为了实现这一点,我从我的 aws lambda 返回了一个 json,例如

context.fail(JSON.stringify({Location:"http://www.google.com",Cookie: vid="233kwer34343"})) 

但我无法通过integration.response.body.errorMessage.Locationintegration.response.body.errorMessage.Cookie 映射标题

可以通过使用 context.succeed() 而不是 context.fail() 来做到这一点。但这不是检查正则表达式。我想检查正则表达式以对响应进行分类。

从 lambda 响应正文映射多个响应标头的最佳方法是什么?

【问题讨论】:

    标签: amazon-web-services http-headers aws-lambda aws-api-gateway


    【解决方案1】:

    这不是因为 API Gateway 或多个标头。请注意,仅在请求的重定向(3xx)或成功处理(2xx)时才会将 Location 标头添加到响应中。返回码为error(4xx, 5xx)等时不添加。

    更多细节在这里 - https://en.wikipedia.org/wiki/HTTP_location

    这就是为什么它适用于 context.succeed() 而它不适用于 context.fail()。

    【讨论】:

    • 没关系.. 但告诉我一种使用 context.fail() 方法映射多个标题的方法。它可能是任何标题。不是位置标题
    • 我不确定这是否可行。无论您发送到 context.fail() 的任何内容,都会添加为 JSON 值。像这样,{ "errorMessage": " {\"Location\":\"google.com\",\"Cookie\":\"233kwer34343\"}" }。您可以收到这样的错误消息 - integration.response.body.errorMessage。也许有深入 JSON 解析经验的人可以澄清我们是否可以进一步解析。
    • yaa...这就是问题所在。我得到了“errorMessage”中的内容。但是在这里我们如何访问单个值,例如 - integration.response.body.errorMessage.Location 或 integration.response.body.errorMessage.Cookie。目前没有发生。
    【解决方案2】:

    我认为你不能使用 context.fail 来完成这项工作。问题是传递给 context.fail 的参数是一个简单的字符串。然后将该字符串编码为 json 字符串,然后作为名为“errorMessage”的属性中的字符串值传递给 API Gateway。

    来自 Lambda 的响应正文如下所示: {"errorMessage": "{\"Location\":\"http://www.google.com\",\"Cookie\": \"vid='233kwer34343'\" }"}

    请注意,errorMessage 的值是一个特殊字符转义的字符串,而不是一个 json 对象。没有办法告诉标头映射在 integration.response.body.errorMessage 中查找,将该字符串解析为 json,并获取结果 json 对象的 location 属性。

    如果您将值作为响应正文而不是标头返回,那么您可以使用速度来解析 errorMessage 的内容并将它们转换为您喜欢的任何响应正文。不幸的是,标头映射不具备速度模板的全部处理能力/灵活性。

    在这种情况下为什么需要调用 context.fail?

    如果您调用 context.done,您可以将 json 作为正文返回,例如:{"Location":"http://www.google.com","Cookie":"vid='233kwer34343'"}

    那么头部映射就是 integration.response.body.Location 和 integration.response.body.Cookie

    【讨论】:

    • 回答:“为什么在这种情况下需要调用 context.fail?”我的基本需求是在各种用例中设置不同的标题。当我使用 context.succeed() 时,我无法映射到多个响应代码,例如 200,210。正则表达式检查没有在那里进行。这就是为什么我使用 context.fail() 并尝试映射多个响应代码,并且在每个响应代码中我试图映射不同的标头。
    • 有没有办法检查响应正文的正则表达式并将它们引导到特定的成功响应代码?我可以在我的 lambda 函数中使用 context.succeed() 并使用多个成功响应代码吗?
    猜你喜欢
    • 2018-04-15
    • 2018-05-02
    • 2020-04-18
    • 2016-07-21
    • 2019-08-12
    • 2015-12-04
    • 2019-10-25
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多