我可以通过 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.Location
和integration.response.body.errorMessage.Cookie
可以使用context.succeed()
代替context.fail()
来执行此操作。但这不是检查正则表达式。我想检查正则表达式对响应进行分类。
从lambda响应体映射多个响应头的最佳方法是什么?
答案 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