如何知道我的Request Body的Content-Length,以便在我的请求标题中添加它

时间:2018-04-12 22:16:59

标签: go http-headers httprequest content-length

我有这段代码:

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

func sendJson(data myStruct,url string) error {
    jsonString, _:= json.Marshal(data)
    pedir, _ := http.NewRequest("PATCH",url, bytes.NewBuffer(jsonString))
    pedir.Header.Add("Content-Length", ?????)
    .....    
}

但是,我不知道如何获得长度;我一直在网上搜索没有找到解决方案,如果你想知道为什么我需要添加内容长度,如果大多数情况下不需要,我使用谷歌的一些apis说明显我需要添加此标题

1 个答案:

答案 0 :(得分:3)

http.NewRequest(method, url string, body io.Reader) (*Request, error)州的文件:

  

...
  如果body的类型为* bytes.Buffer,* bytes.Reader或* strings.Reader,则返回的请求的ContentLength设置为其精确值(而不是-1),GetBody将被填充(因此307和308重定向可以重放body),如果ContentLength为0,则Body设置为NoBody。

您将*bytes.Buffer传递给NewRequest,然后您可以按以下方式设置内容长度:

pedir.Header.Add("Content-Length", strconv.FormatInt(pedir.ContentLength, 10))

注意
正如@MichaelHampton指出的那样,您不需要明确设置Content-Length。它将在需要时添加(通过lib)。 http.Request.Header的文档也清楚地说明了这一点。