You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过API Gateway向AWS Lambda POST JSON数组 出现Go反序列化错误?

问题原因分析
  • 你在Lambda控制台直接测试时,输入的[{"id":"123"}]会被直接序列化后作为入参传给Handler,参数类型和你定义的[]interface{}完全匹配,所以可以正常运行。
  • 对接API Gateway后,默认配置下API Gateway不会直接把客户端POST的请求体内容传给Lambda,而是会将请求的完整上下文(包括请求头、查询参数、请求体、请求方法等)封装为固定结构的JSON对象传递,你提交的数组只是这个对象中body字段的字符串值。Lambda尝试把这个外层的JSON对象反序列化为[]interface{},自然就会报类型不匹配的反序列化错误。
解决方案

你可以根据业务需求选择以下任意一种方案解决问题:

  1. 使用官方事件结构体接收参数(推荐)
    导入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
}
  1. 配置API Gateway映射模板
    如果你不想修改Lambda代码,可以在API Gateway的集成请求配置中,新增Content-Type为application/json的映射模板,模板内容设置为$input.body,配置完成后重新部署API即可让API Gateway直接把请求体透传给Lambda。

内容的提问来源于stack exchange,提问作者iateadonut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 20:36:03