如何通过AWS API Gateway获取DynamoDB同主键的所有项并返回普通JSON?
解决DynamoDB + API Gateway的两个核心需求
没问题,我来帮你搞定这两个需求,一步步说清楚:
一、返回同一primary_key下的所有项
你之前用的是DynamoDB的GetItem操作,这个只能查询单个完整主键(分区键+排序键)对应的项。要获取同一分区键(primary_key)下的所有项,得换成Query操作,具体步骤如下:
- 在API Gateway的集成请求配置里,把DynamoDB的操作从
GetItem改成Query(控制台操作路径:集成请求 → DynamoDB操作 → 选择Query)。 - 修改你的请求body mapping模板为以下内容:
{ "TableName": "table_name", "KeyConditionExpression": "primary_key = :pk", "ExpressionAttributeValues": { ":pk": { "S": "series" } } }
这段模板的作用是:通过KeyConditionExpression指定查询条件为“primary_key等于:pk”,再通过ExpressionAttributeValues给:pk赋值为你要匹配的分区键值(这里是series),这样就能返回所有primary_key为series的项了。
二、返回不带“S”类型标识的普通JSON(无需硬编码属性)
要实现自动转换DynamoDB的带类型数据,同时不用硬编码每个属性,我们可以在集成响应的映射模板里用VTL代码自动处理:
- 在API Gateway的集成响应配置里,确保Content-Type设置为
application/json,并添加对应的映射模板。 - 把映射模板的内容替换成这段VTL代码:
#set($items = $input.path('$.Items')) [ #foreach($item in $items) { #set($firstAttribute = true) #foreach($attributeName in $item.keySet()) #if(!$firstAttribute),#end "$attributeName": $util.dynamodb.toJson($item.get($attributeName)) #set($firstAttribute = false) #end }#if($foreach.hasNext),#end #end ]
这段代码的逻辑:
- 先提取DynamoDB返回的所有项集合;
- 遍历每个项,再遍历项内的所有属性;
- 用
$util.dynamodb.toJson()方法自动把DynamoDB的带类型值(比如{"S":"Types Of Brokers"})转换成普通JSON值(比如"Types Of Brokers"); - 全程不用硬编码任何属性名,以后表新增字段也能自动适配。
内容的提问来源于stack exchange,提问作者Garvit Jain
相关产品推荐
相关产品推荐

