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

San*_*lal 18 http go

文档中可以看出这一点

对于服务器请求,Request Body始终为非零,但在没有正文时立即返回EOF.

对于ContentLength,文档说明

对于客户端请求,如果Body不是nil ,则值0表示未知.

那么检查ContentLength会更好吗?

r *http.Request
if r.ContentLength == 0 {
  //empty body
}
Run Code Online (Sandbox Code Playgroud)

或检查EOF

type Input struct {
    Name *string `json:"name"`
}

input := new(Input)

if err := json.NewDecoder(r.Body).Decode(input); err.Error() == "EOF" {
 //empty body
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 28

你总是需要阅读身体才能知道内容是什么.客户端可以使用chunked编码发送正文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
}
Run Code Online (Sandbox Code Playgroud)

你也可以在解组之前阅读整个身体:

body, err := ioutil.ReadAll(r.Body)
Run Code Online (Sandbox Code Playgroud)

或者如果你担心太多的数据

body, err := ioutil.ReadAll(io.LimitReader(r.Body, readLimit))
Run Code Online (Sandbox Code Playgroud)


小智 13

if http.Request().Body == http.NoBody {
  // TODO.
}
Run Code Online (Sandbox Code Playgroud)

  • 该方法在“http”中不存在,我们可以从“Request”类型访问“Body”字段:https://pkg.go.dev/net/http#Request (2认同)