检查空请求Body的最佳方法是什么?

时间:2015-09-22 07:28:16

标签: http go

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
}

3 个答案:

答案 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
}