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

jxct1oxe  于 2022-12-07  发布在  Go
关注(0)|答案(3)|浏览(167)

documentation中可以看出
对于服务器请求,请求正文始终为非空,但在没有正文时将立即返回EOF。
对于ContentLength,文档说明
对于客户端请求,如果Body不为nil,则值0表示unknown
那么检查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
}
oug3syen

oug3syen1#

你总是需要阅读主体来知道内容是什么。客户端可以发送没有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))
kd3sttzy

kd3sttzy2#

if http.Request().Body == http.NoBody {
  // TODO.
}
vzgqcmou

vzgqcmou3#

最简单的方法

if req.Body == nil {
    fmt.Println("we receive empty data")
}

相关问题