【问题标题】:AWS API Gateway Header and Body Mappings in Integration Response集成响应中的 AWS API Gateway 标头和正文映射
【发布时间】:2018-04-15 09:48:59
【问题描述】:

我正在尝试在 API 网关端点的集成响应中正确设置正文映射和标题映射。

在我们的 Lambda 中,我们有

if (response.statusCode == 200) {
    context.succeed(output);
} else if (response.statusCode == 206) {
    var paginationObject = {
        errorType : "PartialContent",
        errorCode : 206,
        detailedMessage : "PartialContent Returned",
        stackTrace : [],
        data : {
               output
        }
    };

    context.fail(JSON.stringify(paginationObject));
}

然后我使用 .*PartialContent.* 的 Lambda 错误正则表达式在集成响应中处理获取此内容,并将我的身体映射模板作为

#set($allParams = $input.params())
#set($body = $util.parseJson($input.json('$.errorMessage')))

$body

这为我提供了正确的 HTTP 状态代码和 JSON 输出,但正文中的数据过多。响应如下:

{
  "errorType":"PartialContent",
  "errorCode":206,
  "detailedMessage":"PartialContent Returned",
  "stackTrace":[],
  "data":{
    "output":{
      "status":206,
      "bodyJson":[{"call_date":"2017-08-19 18:17:21"}],
      "headers":{"date":"Thu, 02 Nov 2017 18:36:52 GMT",
                 "server":"Apache",
                 "x-pagination-page-size":10}
    }
  }
}

我希望标题在响应中实际显示为标题,并且我希望正文只是 bodyJson 内部的内容

我尝试将正文映射模板更改为使用 $body.data.output.bodyJson,但是当我这样做时,正文完全是空的。我还在 Header Mappers 中设置了标题,尝试了 integration.response.body.headers.x-pagination-page-sizeintegration.response.header.x-pagination -page-size 但两次标题都是空白的,即使我可以在 JSON 输出中看到正确的值。

如何仅将 bodyJson 元素作为响应的主体输出?以及如何正确映射标头?

【问题讨论】:

  • $body.data.output.bodyJson 是一个数组,根据用例的不同,您可以遍历 bodyJson 数组中的所有地图并将它们合并(或返回数组中的第一个地图如果是这样);或者你可以做 {body: $body.data.output.bodyJson};后者将返回类似 {"body": [{"call_date":"2017-08-19 18:17:21"}]} 的地图

标签: json amazon-web-services aws-lambda aws-api-gateway


【解决方案1】:

您是否尝试在集成响应中使用 Lambda 错误正则表达式? 例如:

.*“状态”:400.*

身体映射模板

#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage')))
{
  "status" : "$errorMessageObj.status",
  "errorType" : "$errorMessageObj.errorType",
  "message" : "$errorMessageObj.errorMessage"
}

我在 Lamda 中创建了一个错误函数

function error(status, errorType, errorMessage, callback){
    callback(JSON.stringify({
        status: status,
        errorType: errorType,
        errorMessage: errorMessage
    }));
}

用法:

error(404, "Not Found", "Resource is not found", callback);

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 2020-04-18
    • 2016-12-15
    • 2018-01-20
    • 2018-06-09
    • 2018-12-02
    • 2017-05-18
    • 2017-11-30
    • 2019-08-12
    相关资源
    最近更新 更多