最近开始学习使用go,刚好公司有个需求,使用jir调用webhook后做一些操作,我使用go的http包新建了一个web服务,在获取请求体是遇到了一下问题: 使用
data, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Println("Error reading request body:", err)
return
}
body := string(data)
fmt.Println("Request body:", body)
读取整个请求体(请求体为json格式),发现会少一两个字符,导致结果无法用json解析。 使用
bufReader := bufio.NewReader(r.Body)
defer r.Body.Close()
data := make([]byte, r.ContentLength)
_, err := bufReader.Read(data)
if err != nil {
fmt.Println("Error reading request body:", err)
return
}
body := string(data)
fmt.Println("Request body:", body)
请求体打印出出来直接少了很多内容。
不解应该从何方向入手。 PS:我也尝试使用python flask搭建一样的服务,收到的内容是正常的
有疑问加站长微信联系(非本文作者)

data := make([]byte, r.ContentLength + 200) 解决
1楼 @a984120978
输出:
我不理解,为什么实际读取的数据和ContentLength的长度不一致
r.ContentLength
是接口的 Response Header 返回的, 也就是r.Header.Get("Content-Length")
,由服务端决定。你可以看一下net/http/transfer.go:523
。看错了,以为是 http 请求响应的
如果服务端拿到的
ContentLength
是 5900,但是只读取了 3759 的字节,可能是客户端未发送够 5900 个字节就关闭了连接
服务端的读取超时时间到了,客户端还没发送完毕。
看看 Go 服务端的
ReadTimeout
是不是设置短了。 https://github.com/golang/go/blob/f90b4cd6554f4f20280aa5229cf42650ed47221d/src/net/http/server.go#L2637-L2645或者看看是不是客户端
WriteTimeout
设置太短了。有没有可能, 客户端发送的数据不完整
如果客户端发送的不完整,服务端会阻塞在
n, err := bufReader.Read(data)
这里,直至读取到完整字节,或者客户端关闭了,或者是ReadTimeout
超时。UP 要贴上err
的错误信息。如果读取的字节数不够ContentLength
,read 又没错误,那就奇了怪了我的意思是客户端发送的JSON数据格式有问题