首页 > 解决方案 > AWS API Gateway 部署的 API 无法解析请求正文

问题描述

我有一个与 API Gateway 集成的 Lambda 函数,并且堆栈被部署为云形成模板。当我尝试在 AWS Web 控制台中测试端点时,我得到了正确的响应,但是当我尝试调用 API 的部署版本时,我得到了那个错误。

"message": "Could not parse request body into json: Unrecognized token ....etc"

我在集成请求中尝试了这种映射{ "body" : $input.json('$') },但没有奏效。

这是我尝试使用 POSTMAN 发送的 JSON

{
    "description": "test description",
    "status": "test status"
}

并且请求具有标头:Content-Type: application/json

这是 POSTMAN 请求正文和标头的屏幕截图,以及来自 API 的响应:

在此处输入图像描述 在此处输入图像描述

任何解决方案的家伙?

更新:

我在集成请求级别放置了一个映射模板,如下所示:

{
   "body-json" : $input.json('$')
}

并更新了 lambda 函数以记录即将到来的请求,然后发出 2 个请求:

第一个:来自 API Gateway 测试 Web 控制台:

我在 cloudwatch 日志中发现了以下内容:

INFO    {
  body: {
    description: 'test',
    projectId: 23,
    action: 'test',
    entity: 'test',
    startDate: '01-01-2020',
    endDate: '01-01-2020'
  }
}

第二个:来自邮递员:

我在 cloudwatch 日志中发现了以下内容:

INFO    {
  body: 'ewogICAgImRlc2NyaXB0aW9uIjogInRlc3QiLAogICAgInByb2plY3RJZCI6IDIzLAogICAgImFjdGlvbiI6ICJ0ZXN0IiwKICAgICJlbnRpdHkiOiAidGVzdCIsCiAgICAic3RhcnREYXRlIjogIjAxLTAxLTIwMjAiLAogICAgImVuZERhdGUiOiAiMDEtMDEtMjAyMCIKfQ=='
}

这表明在使用 POSTMAN 发出请求的情况下,JSON 有效负载会自动进行字符串化。什么会导致这样的事情?以及如何处理?

标签: amazon-web-servicesaws-lambdaamazon-cloudformationaws-api-gateway

解决方案


在这种情况下,我们需要编辑映射模板,因为我们没有使用代理集成。

"body-json" : $input.json('$')
//also if binary data type is enabled for your api your body will be a base64
//encoded string which could be decoded using
$util.base64Decode($input.json('$'))

二进制数据类型也可能默认启用,在 SAM 模板中搜索这些

x-amazon-apigateway-binary-media-types:
- '*/*'

推荐阅读