Как получить необработанные данные post из HttpServletRequest в java

Я пытаюсь получить данные post в Java. Кажется, это должна быть одна из самых простых вещей, чтобы сделать правильно? Я имею в виду, HttpServletRequest.getParameter должен сделать это правильно? Итак, как вы можете получить необработанные данные post?

нашел HttpServletRequest получить данные JSON POST и использовал код Kdeveloper для извлечения данных post из запроса. Это работает, но есть уловка: я могу получить только эти данные post после.

вот метод, который я сделал из Код Kdeveloper это:

public static String getPostData(HttpServletRequest req) {
    StringBuilder sb = new StringBuilder();
    try {
        BufferedReader reader = req.getReader();
        reader.mark(10000);

        String line;
        do {
            line = reader.readLine();
            sb.append(line).append("n");
        } while (line != null);
        reader.reset();
        // do NOT close the reader here, or you won't be able to get the post data twice
    } catch(IOException e) {
        logger.warn("getPostData couldn't.. get the post data", e);  // This has happened if the request's reader is closed    
    }

    return sb.toString();
}

ранее я закрыл считыватель в конце этого метода, но это вызвало исключения, когда метод выполнялся более одного раза по тому же запросу. Без его закрытия исключений не происходит, но метод возвращает пустую строку.

честно говоря, должен быть только открытый req.метод getPostData () - никто не думал, что это будет полезно?

Итак, как я могу написать этот метод, чтобы он всегда возвращал правильный пост Дейта?

2 ответов


тело запроса доступно по HttpServletRequest#getInputStream() и #getReader().

InputStream body = request.getInputStream();
// ...

обратите внимание, что вы можете прочитать его только один раз. Клиент не собирается повторять это несколько раз. Зову getParameter() и так далее будет неявно также читать его. Вы должны где-то хранить тело и обрабатывать себя.


У нас была ситуация, когда IE заставил нас публиковать как text / plain, поэтому нам пришлось вручную анализировать параметры с помощью getReader. Сервлет использовался для длительного опроса, поэтому, когда AsyncContext::dispatch был выполнен после задержки, он буквально перепечатывал запрос с пустыми руками.

поэтому я просто сохранил сообщение в запросе, когда он впервые появился с помощью HttpServletRequest:: setAttribute. Метод getReader очищает буфер, где getParameter также очищает буфер но сохраняет параметры автоматически.

    String input = null;

    // we have to store the string, which can only be read one time, because when the
    // servlet awakens an AsyncContext, it reposts the request and returns here empty handed
    if ((input = (String) request.getAttribute("com.xp.input")) == null) {
        StringBuilder buffer = new StringBuilder();
        BufferedReader reader = request.getReader();

        String line;
        while((line = reader.readLine()) != null){
            buffer.append(line);
        }
        // reqBytes = buffer.toString().getBytes();

        input = buffer.toString();
        request.setAttribute("com.xp.input", input);
    }

    if (input == null) {
        response.setContentType("text/plain");
        PrintWriter out = response.getWriter();
        out.print("{\"act\":\"fail\",\"msg\":\"invalid\"}");
    }