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

Golang如何传递map结构JSON请求体到API 修复gRPC请求数组缺失问题

根因

当前proto文件中SearchMovieRequest的data字段被定义为单个TicketData类型,按照Protobuf和JSON的映射规则,单个消息类型序列化后对应JSON普通对象,不会生成数组包裹结构,和目标接口要求的数组格式不匹配。
你之前尝试的structpb、map[string]interface{}方案无效,是因为这类方案属于动态类型序列化实现,没有从proto字段定义层面标记数组属性,Postman读取proto反射元数据时,仍会将该字段识别为普通对象/动态结构,既不会自动生成数组格式的请求模板,序列化输出时也不会默认添加数组包裹。

修复步骤
  • 修改proto定义,给data字段添加repeated修饰符,标记该字段为数组类型:
message TicketData {
    string movie = 1;
    string seat = 2;
    uint32 pax = 3;
    string class = 4;
}

message SearchMovieRequest {
    repeated TicketData data = 1;
}

repeated是Protobuf原生的数组/列表修饰符,修饰后的字段在JSON映射中会自动对应为数组格式。

  • 重新执行protoc命令生成对应Go语言的pb代码,新生成的代码中SearchMovieRequest的Data字段类型会变为[]*TicketData切片类型。
  • Go侧赋值时按照切片格式传入参数即可,示例代码:
// 构造gRPC请求
req := &SearchMovieRequest{
    Data: []*TicketData{
        {
            Movie: movie,
            Seat:  seat,
            Pax:   pax,
            Class: class,
        },
    },
}

修改完成后,Postman读取新的proto元数据发起请求时,请求体模板会自动将data字段展示为数组格式,序列化后的结构完全匹配目标接口要求:

{
    "data": [
        {
            "movie": "abc",
            "seat": "123",
            "pax": 2,
            "class": "b"
        }
    ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:42:21