Golang中处理JSON POST请求时出现HTTP错误:ContentLength=222与Body length 0不符
Golang中处理JSON POST请求时出现HTTP错误:ContentLength=222与Body length 0不符 我正在尝试使用 http.NewRequest 向服务器发送 JSON 载荷,但遇到错误 “http: ContentLength=222 with Body length 0”。
input,_ := json.Marshal(msgin)
req,_ := http.NewRequest("POST",url, bytes.NewBuffer(input))
req.Header.Set("Content-Type","application/json")
client := http.Client{Transport: defaultTransport}
resp, err := client.Do(req)
defer resp.Body.Close()
更多关于Golang中处理JSON POST请求时出现HTTP错误:ContentLength=222与Body length 0不符的实战教程也可以访问 https://www.itying.com/category-94-b0.html
不要忽略来自 json.Marshal 和 http.NewRequest 的错误,它们可能很有用
更多关于Golang中处理JSON POST请求时出现HTTP错误:ContentLength=222与Body length 0不符的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我发现了请求头的问题,在添加了以下请求头后就能正常发送了: req.Header.Add(“Accept”,"/")
你好,感谢你的回复。
我已经添加了错误处理,但在请求中找不到问题,似乎是负载数据的问题。
我再次使用 Postman 尝试了相同的负载数据,它工作正常。
这是一个常见的HTTP客户端错误,问题在于bytes.NewBuffer(input)创建的缓冲区在请求发送前可能已被读取或重置。当实际发送请求时,Body的长度为0,但Content-Length头已经设置为222,导致两者不匹配。
以下是正确的实现方式:
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
type Message struct {
Text string `json:"text"`
ID int `json:"id"`
}
msgin := Message{Text: "Hello World", ID: 1}
url := "https://httpbin.org/post"
// 序列化JSON
input, err := json.Marshal(msgin)
if err != nil {
fmt.Printf("JSON序列化错误: %v\n", err)
return
}
// 创建请求,确保使用bytes.NewReader或bytes.NewBuffer
req, err := http.NewRequest("POST", url, bytes.NewReader(input))
if err != nil {
fmt.Printf("创建请求错误: %v\n", err)
return
}
// 设置正确的Content-Type头
req.Header.Set("Content-Type", "application/json")
// 创建HTTP客户端并发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("请求错误: %v\n", err)
return
}
defer resp.Body.Close()
fmt.Printf("响应状态: %s\n", resp.Status)
}
关键修改点:
- 使用
bytes.NewReader(input)而不是bytes.NewBuffer(input),因为Reader是不可重读的,更适合HTTP请求体 - 添加了完整的错误处理
- 使用标准的
http.Client{}而不是自定义Transport
如果必须使用Buffer,确保在创建请求后没有意外地读取或修改Buffer:
// 使用Buffer的替代方案
buffer := bytes.NewBuffer(input)
req, err := http.NewRequest("POST", url, buffer)
if err != nil {
fmt.Printf("创建请求错误: %v\n", err)
return
}
// 不要在创建请求后操作buffer
// buffer.Reset() 或 buffer.Read() 会导致Body长度变为0
检查你的代码中是否在创建请求后对bytes.Buffer执行了任何读取或重置操作,这会导致Body长度变为0。

