从文档中它指出对于服务器请求,请求正文始终为非零,但在没有正文时会立即返回 EOF。对于 ContentLength,文档说明对于客户端请求,如果 Body 不为零,则值为 0 表示未知。那么检查 ContentLength 是否更好r *http.Requestif r.ContentLength == 0 { //empty body}或检查EOFtype Input struct { Name *string `json:"name"`}input := new(Input)if err := json.NewDecoder(r.Body).Decode(input); err.Error() == "EOF" { //empty body}
2 回答
倚天杖
TA贡献1828条经验 获得超3个赞
你总是需要阅读正文才能知道内容是什么。客户端可以不带 no 的分块编码发送正文Content-Length,或者它甚至可能有错误并发送 aContent-Length和 no 正文。客户端从来没有义务发送它所说的将要发送的内容。
该EOF检查可以工作,如果你只检查空的身体,但我仍然会还检查除了其他错误情况EOF字符串。
err := json.NewDecoder(r.Body).Decode(input)
switch {
case err == io.EOF:
// empty body
case err != nil:
// other error
}
您还可以在解组之前阅读整个正文:
body, err := ioutil.ReadAll(r.Body)
或者如果您担心数据过多
body, err := ioutil.ReadAll(io.LimitReader(r.Body, readLimit))
- 2 回答
- 0 关注
- 116 浏览
添加回答
举报
0/150
提交
取消