1

我在调用 GET REST(区域)API 时遇到问题,该 API 然后调用 DynamoDB 扫描 API 以获取名为 City-Temperature 的表的所有项目。

作为请求参数,我只添加了“表名”,因为它需要调用 DynamoDB:Scan API。但是在测试 API 时,我从 DynamoDB 获得 400 状态,错误如下:

{
  "__type": "com.amazon.coral.validate#ValidationException",
  "message": "1 validation error detected: Value null at 'tableName' failed to satisfy constraint: Member must not be null"
}

为简单起见,dynamoDB 表“City-Temperature”包含五个项目,每个项目“City”(主键 - 字符串)包含单个属性(字符串)“Temperature”。

我生成 API 服务代理的步骤:

  1. 创建了一个新的 REST API。
  2. 创建了一个名为“get-cities-temp”的资源
  3. 使用路径 {tablename} 创建了一个名为“table-name”的子资源
  4. 为子资源创建了一个 GET 方法:
    • 集成类型:AWS 服务
    • 区域:与 DynamoDB 区域相同
    • 服务:DynamoDB
    • 行动:扫描
    • HTTP 方法:POST(因为对 DynamoDB 的所有请求都是使用 POST 发出的)
    • 执行角色 ARN:(假定为 API-Gateway 创建角色并附加一个策略,该策略仅允许单个操作“DynamoDB:Scan”,资源 ARN 指向 DyanmoDB“City-Temperature”表。
  5. 在集成方法窗格中,我将“内容处理”保留为“直通”,并添加了内容类型为“应用程序/json”的映射模板,以将具有单个参数“表名”的请求转换为与 DynamoDB 兼容,如下所示:

在此处添加:“请求正文传递”设置为“当没有定义模板时(推荐)”

{
    "tableName": "$input.params('tablename')"
}

最后,在测试部分,我添加 tablename=City-Temperature 作为查询字符串,以传递扫描 API 的表名并点击“测试”。但是上面提到的错误正在响应中被抛出。

更新:

在日志中,看起来转换后的请求正文被正确转换:{ "tablename": "City-Temperature" }。但是,与上述相同的错误

4

1 回答 1

3

基于https://aws.amazon.com/blogs/compute/using-amazon-api-gateway-as-a-proxy-for-dynamodb/tableName不是属性对象类型,而是简单的string. 编辑:属性也应该是帕斯卡大小写。因此下面的变化应该做

{
    "TableName":"$input.params('tablename')"
}
于 2020-04-19T17:52:52.247 回答