Http 检查空请求正文的最佳方法是什么?
从报告中可以看出 对于服务器请求,请求正文始终为非nil,但在没有正文时将立即返回EOF 对于ContentLength,文档状态为 对于客户端请求,如果Body不是nil,则值0表示未知 那么,检查ContentLength是否更好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
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.
}