使用AWS Lambda响应正文

时间:2016-08-09 10:39:39

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

我可以通过 api网关集成响应标头映射设置单个 http 响应标头。
在那种情况下,我从 aws lambda 给出context.fail("http://www.google.com")响应,并使用正则表达式(“.http。”)来识别响应,最后将其映射到我的标题,如下所示
Location: integration.response.body.errorMessage
当我尝试一次映射一个标题时,这是有效的 但我想在单个响应中设置位置和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响应体映射多个响应头的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

这不是因为API网关或多个标头。请注意,Location头将仅添加到响应中,仅用于请求的重定向(3xx)或成功过程(2xx)。当返回码是错误(4xx,5xx)等时,它不会被添加。

此处有更多详情 - https://en.wikipedia.org/wiki/HTTP_location

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

答案 1 :(得分:0)

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

来自Lambda的响应主体看起来像这样:{“errorMessage”:“{\”Location \“:\”http://www.google.com \“,\”Cookie \“:\”vid ='233kwer34343' \ “}”}

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

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

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

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

然后标题映射只是integration.response.body.Location和integration.response.body.Cookie