最近开始学习使用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搭建一样的服务,收到的内容是正常的
如果客户端发送的不完整,服务端会阻塞在 `n, err := bufReader.Read(data)` 这里,直至读取到完整字节,或者客户端关闭了,或者是 `ReadTimeout` 超时。UP 要贴上 `err` 的错误信息。如果读取的字节数不够 `ContentLength`,read 又没错误,那就奇了怪了
#6
更多评论
1楼 <a href="/user/a984120978" title="@a984120978">@a984120978</a>
```
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