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

4 回复

不要忽略来自 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)
}

关键修改点:

  1. 使用bytes.NewReader(input)而不是bytes.NewBuffer(input),因为Reader是不可重读的,更适合HTTP请求体
  2. 添加了完整的错误处理
  3. 使用标准的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。

回到顶部