从documentation开始说明
对于服务器请求,Request Body始终为非零,但在没有正文时会立即返回EOF。
对于ContentLength,文档说明
对于客户请求,如果Body不是nil,则值0表示未知。
最好检查ContentLength
r *http.Request
if r.ContentLength == 0 {
//empty body
}
或检查EOF
type Input struct {
Name *string `json:"name"`
}
input := new(Input)
if err := json.NewDecoder(r.Body).Decode(input); err.Error() == "EOF" {
//empty body
}
答案 0 :(得分:23)
你总是需要阅读身体才能知道内容是什么。客户端可以使用没有Content-Length
的分块编码发送正文,或者甚至可能发生错误并发送Content-Length
并且没有正文。客户从未有义务发送它要发送的内容。
如果您只检查空体,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))
答案 1 :(得分:2)
if http.Request().Body == http.NoBody {
// TODO.
}
答案 2 :(得分:-3)
通常情况下,您可以查看请求的方法,以了解是否需要身体。
例如,GET请求永远不应该有一个正文,而PUT和POST请求应该有一个。
所以你的if
断言也可以这样写:
if r.Method == "PUT" || r.Method == "POST" {
// do something that depends on the body content
} else {
// don't even try to read the body and do something else
}