Http 检查空请求正文的最佳方法是什么?

Http 检查空请求正文的最佳方法是什么?,http,go,Http,Go,从报告中可以看出 对于服务器请求,请求正文始终为非nil,但在没有正文时将立即返回EOF 对于ContentLength,文档状态为 对于客户端请求,如果Body不是nil,则值0表示未知 那么,检查ContentLength是否更好 r *http.Request if r.ContentLength == 0 { //empty body } 或者检查EOF type Input struct { Name *string `json:"name"` } input := n

从报告中可以看出

对于服务器请求,请求正文始终为非nil,但在没有正文时将立即返回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
}

你总是需要阅读正文才能知道内容是什么。客户端可以以分块编码方式发送正文,但不包含
内容长度
,或者甚至可能出现错误,发送
内容长度
且不包含正文。客户从来没有义务发送它说要发送的内容

如果只检查空正文,则
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))

显然,EOF,
Content Length
是客户端可以设置或不能设置的标题。不要弄乱错误的字符串值。如果您正在查找
io.EOF
,那么如果err==io.EOF,请执行
。看着字符串表示法,充其量是难以置信的脆弱。像一个魅力一样工作,谢谢!
if http.Request().Body == http.NoBody {
  // TODO.
}