如何通过API Gateway向AWS Lambda POST JSON数组 出现Go反序列化错误?
问题原因分析
- 你在Lambda控制台直接测试时,输入的
[{"id":"123"}]会被直接序列化后作为入参传给Handler,参数类型和你定义的[]interface{}完全匹配,所以可以正常运行。 - 对接API Gateway后,默认配置下API Gateway不会直接把客户端POST的请求体内容传给Lambda,而是会将请求的完整上下文(包括请求头、查询参数、请求体、请求方法等)封装为固定结构的JSON对象传递,你提交的数组只是这个对象中
body字段的字符串值。Lambda尝试把这个外层的JSON对象反序列化为[]interface{},自然就会报类型不匹配的反序列化错误。
解决方案
你可以根据业务需求选择以下任意一种方案解决问题:
- 使用官方事件结构体接收参数(推荐)
导入github.com/aws/aws-lambda-go/events包,用官方封装的API Gateway请求结构体接收参数,再自行反序列化请求体即可,示例代码如下:
package main import ( "encoding/json" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-lambda-go/events" ) func main() { lambda.Start(Handler) } func Handler(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { var s []interface{} if err := json.Unmarshal([]byte(req.Body), &s); err != nil { return events.APIGatewayProxyResponse{StatusCode: 400, Body: "invalid request body"}, err } respBody, _ := json.Marshal(s) return events.APIGatewayProxyResponse{ StatusCode: 200, Headers: map[string]string{"Content-Type": "application/json"}, Body: string(respBody), }, nil }
- 配置API Gateway映射模板
如果你不想修改Lambda代码,可以在API Gateway的集成请求配置中,新增Content-Type为application/json的映射模板,模板内容设置为$input.body,配置完成后重新部署API即可让API Gateway直接把请求体透传给Lambda。
内容的提问来源于stack exchange,提问作者iateadonut
相关产品推荐
相关产品推荐

