Подтвердить что ты не робот

Каков наилучший способ проверки пустого запроса Body?

В документации указано, что

Для запросов сервера Тело запроса всегда не равно нулю, но возвращает EOF немедленно, когда тело отсутствует.

Для ContentLength в документации указано

Для запросов клиентов значение 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
}
4b9b3361

Ответ 1

Вам всегда нужно прочитать тело, чтобы узнать, что такое содержимое. Клиент может отправить тело в закодированное кодирование без 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))

Ответ 2

Обычно вы можете посмотреть на метод запроса, чтобы знать, как ожидать тело или нет.

Например, в запросах GET никогда не должно быть тела, а запросы PUT и POST должны иметь один.

Итак, ваше утверждение if также может быть записано следующим образом:

if r.Method == "PUT" || r.Method == "POST" {
    // do something that depends on the body content
} else {
    // don't even try to read the body and do something else
}