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

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

documentation中可以看出
对于服务器请求,请求正文始终为非空,但在没有正文时将立即返回EOF。
对于ContentLength,文档说明
对于客户端请求,如果Body不为nil,则值0表示unknown
那么检查ContentLength是否更好呢

  1. r *http.Request
  2. if r.ContentLength == 0 {
  3. //empty body
  4. }

或检查EOF

  1. type Input struct {
  2. Name *string `json:"name"`
  3. }
  4. input := new(Input)
  5. if err := json.NewDecoder(r.Body).Decode(input); err.Error() == "EOF" {
  6. //empty body
  7. }
oug3syen

oug3syen1#

你总是需要阅读主体来知道内容是什么。客户端可以发送没有Content-Length的块编码的主体,或者它甚至可能有一个错误,发送一个Content-Length而没有主体。客户端从来没有义务发送它所说的要发送的东西。
如果只检查空的主体,EOF检查可以工作,但是除了EOF字符串之外,我还将检查其他错误情况。

  1. err := json.NewDecoder(r.Body).Decode(input)
  2. switch {
  3. case err == io.EOF:
  4. // empty body
  5. case err != nil:
  6. // other error
  7. }

您也可以在解组之前读取整个主体:

  1. body, err := ioutil.ReadAll(r.Body)

或者担心数据太多

  1. body, err := ioutil.ReadAll(io.LimitReader(r.Body, readLimit))
展开查看全部
kd3sttzy

kd3sttzy2#

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

vzgqcmou3#

最简单的方法

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

相关问题