最简json post请求需用http.post,但必须先json.marshal序列化再bytes.newreader包装,且显式指定"application/json"类型;返回响应须defer resp.body.close()防止连接泄漏。

用 http.Post 发起最简 JSON POST 请求
想快速发个带 JSON 的 POST?http.Post 是最短路径,但它只接受 io.Reader 作 body,不能直接传 map 或 struct。你得自己序列化再包装成 bytes.NewReader。
- 必须手动调用
json.Marshal,否则会传空 body 或 panic -
http.Post默认设Content-Type: application/x-www-form-urlencoded,不是 JSON —— 必须显式覆盖 - 返回的
*http.Response一定要defer resp.Body.Close(),否则连接不释放,压测时很快耗尽 fd
data := map[string]string{"name": "Alice", "age": "30"}
payload, _ := json.Marshal(data)
resp, err := http.Post("https://api.example.com/users", "application/json", bytes.NewReader(payload))
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
用 http.NewRequest + http.Client 精确控制 Header 和超时
一旦需要设多个 Header(比如 Authorization、X-Request-ID)、自定义超时、或复用连接,http.Post 就不够用了。必须用 http.NewRequest 构造请求,再交由 http.Client 发送。
-
http.NewRequest第二个参数是 method,第三个是 URL,第四个才是 body —— 顺序容易错,尤其和http.Post对比时 - Header 要用
req.Header.Set,不是req.Header.Add(后者会重复,某些服务端拒绝) -
http.DefaultClient没设超时,生产环境必须新建&http.Client{Timeout: 10 * time.Second}
req, _ := http.NewRequest("POST", "https://api.example.com/users", bytes.NewReader(payload))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer abc123")
req.Header.Set("X-Request-ID", uuid.New().String())
<p>client := &http.Client{Timeout: 8 * time.Second}
resp, err := client.Do(req)
</p>
常见错误:JSON 字段名没打 `json` tag 导致提交空对象
结构体字段首字母小写(未导出)或没加 json tag,json.Marshal 会忽略它们,body 变成 {},服务端收不到数据 —— 这类问题不报错,但请求逻辑失败,极难排查。
用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...
- 导出字段必须首字母大写,且建议显式写
json:"field_name",避免依赖默认映射规则 - 嵌套结构体字段也要打 tag,否则深层字段丢失
- 用
json.MarshalIndent本地打印调试,确认输出符合预期再发请求
type User struct {
Name string `json:"name"` // ✅ 必须有
Age int `json:"age"`
token string `json:"-"` // ❌ 小写字段默认不序列化,加 `-` 显式忽略更安全
}
要不要用第三方库?resty vs 原生 net/http
如果项目里只有两三个 HTTP 调用,原生 net/http 更轻量、无额外依赖、行为透明。但若频繁调用外部 API,尤其要处理重试、自动解码 JSON、cookie 管理、日志埋点等,resty 能省掉大量样板代码。
-
resty默认开启重试(可关),原生要自己写循环 +time.Sleep -
resty.R().SetBody(u).Post(url)自动序列化 struct,不用手写json.Marshal - 注意
resty的SetResult和SetError是类型擦除的,泛型支持弱,复杂响应结构仍需小心处理
多数内部微服务间调用,用原生就够了;对外部不稳定服务(如支付、短信网关),resty 的重试和日志能力值得引入。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










