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

如何获取请求体的Content-Length并添加至请求头?(Go代码场景)

解决Go中手动设置请求Content-Length的问题

嗨,很高兴能帮到你!针对你的问题,我们一步步来梳理解决方案:

1. 获取Content-Length的正确方式

你已经通过json.Marshal(data)得到了jsonString(类型是[]byte),它的字节长度就是你需要的Content-Length值。只需要用len()函数获取长度,再通过strconv.Itoa()转成字符串即可。

修改后的完整代码示例如下:

import (
    "bytes"
    "encoding/json"
    "net/http"
    "strconv"
    "time"
)

type myStruct struct { 
    ID     string    `json:"id"` 
    Nombre string    `json:"nombre"` 
    Date   time.Time `json:"date"` 
}

func sendJson(data myStruct, url string) error {
    jsonString, err := json.Marshal(data)
    if err != nil {
        return err // 不要忽略JSON序列化的错误
    }
    req, err := http.NewRequest("PATCH", url, bytes.NewBuffer(jsonString))
    if err != nil {
        return err // 不要忽略请求创建的错误
    }
    // 手动设置Content-Length
    req.Header.Add("Content-Length", strconv.Itoa(len(jsonString)))
    // 别忘了设置Content-Type,JSON请求通常需要这个头
    req.Header.Set("Content-Type", "application/json")
    
    // 后续发送请求的逻辑示例
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()
    // 可根据业务需求处理响应内容
    return nil
}

2. 关于手动设置Content-Length的补充说明

你提到“大多数情况下不需要手动添加”这点完全正确——Go的http.Client在发送请求时会自动处理Content-Length:

  • 如果请求体是io.Seeker或io.ReaderAt类型(比如你用的bytes.Buffer),客户端会自动计算并设置Content-Length
  • 如果无法获取请求体长度,会自动使用分块编码(Chunked Transfer Encoding)

但如果你确实有手动设置的需求(比如某些特殊服务端要求必须显式设置,或者你需要强制使用固定长度值),手动设置是完全可行的,它会覆盖客户端自动生成的头信息。

另外提醒一句:不要忽略json.Marshal和http.NewRequest返回的错误,这些错误处理能帮你快速排查序列化失败、请求创建失败等问题。

内容的提问来源于stack exchange,提问作者John Balvin Arias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:08:56