Go语言如何在HTTP请求中发送含不同JSON对象的JSON数组
Go 语言实现指定格式HTTP请求发送的方法
核心目标对齐
首先要完全匹配给出的curl行为:
- 最终发送的表单参数为
data,参数值是一个JSON数组,数组内包含两个独立单键对象:第一个对象键为id、值为你持有的id字符串;第二个对象键为name、值为你持有的name字符串,结构示例为[{"id":"ab1"},{"name":"Mash"}] - 该表单参数需要经过URL编码,以
application/x-www-form-urlencoded格式作为请求体发送。
分步实现逻辑
1. 构建符合要求的JSON数组
不要手动拼接JSON字符串,使用Go标准库encoding/json完成序列化,避免特殊字符导致的格式错误:
import "encoding/json" // 你持有的两个独立值 idVal := "ab1" nameVal := "Mash" // 按目标结构组装数组元素,每个元素是独立的单键对象 payloadItems := []map[string]string{ {"id": idVal}, {"name": nameVal}, } // 序列化为标准JSON字符串 jsonContent, err := json.Marshal(payloadItems) if err != nil { // 自行处理序列化错误,比如打印日志、中断流程 panic(err) } // 此时jsonContent的内容就是目标格式的`[{"id":"ab1"},{"name":"Mash"}]`
2. 匹配curl的urlencode表单格式
使用Go标准库net/url处理表单参数编码,和curl的--data-urlencode逻辑完全等价:
import "net/url" // 构建表单键值对 form := url.Values{} form.Set("data", string(jsonContent)) // 编码生成最终的请求体内容 encodedReqBody := form.Encode()
3. 发起HTTP请求
设置和curl默认行为一致的请求头,发送请求:
import ( "net/http" "strings" ) // 替换为你的实际目标接口 targetURL := "https://your-target-endpoint.com" // 构造请求 req, err := http.NewRequest(http.MethodPost, targetURL, strings.NewReader(encodedReqBody)) if err != nil { panic(err) } // 设置匹配的Content-Type,和curl发送表单的默认头一致 req.Header.Set("Content-Type", "application/x-www-form-urlencoded") // 执行请求 resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close()
常见踩坑提示
- 禁止手动用格式化字符串拼接JSON,一旦id或name值中包含双引号、反斜杠、控制字符,生成的JSON就会格式非法,导致服务端解析失败。
- 不要直接把序列化好的JSON作为原始请求体发送,这和curl中
--data-urlencode的行为完全不一致:curl的该参数本质是发送编码后的表单数据,不是未编码的原始JSON。- 可通过打印
encodedReqBody的内容,和curl加-v参数抓取的实际发送内容做比对,二者完全一致即说明实现正确。
内容的提问来源于stack exchange,提问作者Hash934
相关产品推荐
相关产品推荐

