如何在Golang中实现等效Python示例的带数组字段JSON POST请求
Golang实现等价Python JSON POST请求的方法
你之前使用map[string]string传参报错的原因很简单:该类型的value固定为字符串,无法承载数字、数组这类非字符串类型的JSON值,以下两种方案都可以实现和你给出的Python代码完全一致的请求效果。
方案1:定义结构体传参(推荐,类型安全)
通过给结构体字段添加JSON标签,序列化后的字段名和格式会和Python字典完全匹配,数组字段直接定义为[]string类型即可:
package main import ( "bytes" "encoding/json" "net/http" ) // 定义请求参数对应的结构体,json标签对应JSON里的字段名 type RequestData struct { Name string `json:"name"` Age int `json:"age"` Nationality []string `json:"nationality"` } func main() { // 构造参数 data := RequestData{ Name: "Frank", Age: 21, Nationality: []string{"Britan"}, } // 序列化为JSON字节流 jsonBody, _ := json.Marshal(data) // 发送POST请求,第二个参数指定Content-Type为application/json,和Python传json参数的行为一致 resp, err := http.Post("somesite", "application/json", bytes.NewBuffer(jsonBody)) if err != nil { // 自行处理请求错误 panic(err) } defer resp.Body.Close() // 后续可以通过resp读取响应内容 }
方案2:使用泛型map传参(无需提前定义结构)
如果不想单独定义结构体,把map的value类型设置为interface{}即可存储任意JSON支持的类型,数字、数组、嵌套对象都可以正常传递:
package main import ( "bytes" "encoding/json" "net/http" ) func main() { // 注意map值类型为interface{},不要用map[string]string data := map[string]interface{}{ "name": "Frank", "age": 21, "nationality": []string{"Britan"}, } jsonBody, _ := json.Marshal(data) resp, err := http.Post("somesite", "application/json", bytes.NewBuffer(jsonBody)) if err != nil { panic(err) } defer resp.Body.Close() }
注意事项
- 两种方案最终生成的JSON请求体和Python requests的
json=data参数输出完全一致,nationality字段会正确序列化为数组格式,不会出现类型不匹配报错 - 如果需要自定义超时、请求头、认证信息等配置,可以用
http.NewRequest构造请求对象后,通过自定义的http.Client实例发送,JSON序列化逻辑和上面完全一致 - 不要忘记调用
defer resp.Body.Close()关闭响应体,避免资源泄露
内容的提问来源于stack exchange,提问作者NerdSilimar
相关产品推荐
相关产品推荐

