Как определить, есть ли у HttpServletRequest тело? - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь определить, есть ли в http-запросе тело, не читая его или не делая ничего, что не позволяет существующему коду делать с ним все, что он делает позже в потоке.

boolean hasBody(HttpServletRequest http) {
    boolean hasBody = false;
    try {
        hasBody = http.getInputStream() != null; // always gives true
        hasBody = http.getReader().ready(); // always gives IllegalStateException
    } catch (IOException e) {
    }
    return hasBody;
}

К сожалению обе проверки, которые я мог придумать, не работают, когда я проверяю их как GET и как POST с телом.

Обратите внимание, я не хочу делать: "POST".equals(http.getMethod()) или !"GET".equals(http.getMethod()), если это возможно, потому что я не уверен, какие методы могут быть с телом или без него.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Вы можете использовать getContentLength () или getContentLengthLong () и проверить, является ли он положительным.

1 голос
/ 22 апреля 2020

Запрос, который включает тело, должен иметь определенный набор заголовков, если он следует https://tools.ietf.org/html/rfc7230#section -3,3

О присутствии тела сообщения в запросе сигнализируется поле заголовка Content-Length или Transfer-Encoding.

Вы можете проверить наличие этих заголовков с помощью http.getHeader("transfer-encoding") != null || http.getHeader("content-length") != null.

Тело запроса может присутствовать, но пусто. Если вы хотите поймать это, вы можете добавить проверку на длину содержимого> 0, но это будет работать, только если запрос содержит заголовок длины содержимого. Похоже, вы должны попытаться прочитать тело запроса, чтобы увидеть, является ли оно пустым, когда нет заголовка длины содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...