新手 求助(关于net/http包request对象请求体内容解析字节丢失问题)

Septemberrrrrr · 2023-05-26 13:16:31 · 2057 次点击

如果服务端拿到的 ContentLength 是 5900,但是只读取了 3759 的字节,

  1. 可能是客户端未发送够 5900 个字节就关闭了连接

  2. 服务端的读取超时时间到了,客户端还没发送完毕。

看看 Go 服务端的 ReadTimeout 是不是设置短了。 https://github.com/golang/go/blob/f90b4cd6554f4f20280aa5229cf42650ed47221d/src/net/http/server.go#L2637-L2645

或者看看是不是客户端 WriteTimeout 设置太短了。

#4
更多评论

data := make([]byte, r.ContentLength + 200) 解决

#1

1楼 @a984120978

func webhook(w http.ResponseWriter, r *http.Request) {
    bufReader := bufio.NewReader(r.Body)
    defer r.Body.Close()

    data := make([]byte, r.ContentLength+200)
    n, err := bufReader.Read(data)
    fmt.Println("总长度为", r.ContentLength)
    fmt.Println("定义的buff长度", len(data))
    fmt.Println("读取的长度", n)
    if err != nil {
        fmt.Println("Error reading request body:", err)
        return
    }
}

输出:

总长度为 5900
定义的buff长度 6100
读取的长度 3759

我不理解,为什么实际读取的数据和ContentLength的长度不一致

#2