Получить тело запроса POST от HttpServletRequest

Я пытаюсь получить все тело из объекта HttpServletRequest.

Код, которому я следую, выглядит следующим образом:

if ( request.getMethod().equals("POST") )
{
    StringBuffer sb = new StringBuffer();
    BufferedReader bufferedReader = null;
    String content = "";

    try {
        //InputStream inputStream = request.getInputStream();
        //inputStream.available();
        //if (inputStream != null) {
        bufferedReader =  request.getReader() ; //new BufferedReader(new InputStreamReader(inputStream));
        char[] charBuffer = new char[128];
        int bytesRead;
        while ( (bytesRead = bufferedReader.read(charBuffer)) != -1 ) {
            sb.append(charBuffer, 0, bytesRead);
        }
        //} else {
        //        sb.append("");
        //}

    } catch (IOException ex) {
        throw ex;
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ex) {
                throw ex;
            }
        }
    }

    test = sb.toString();
}

и я тестирую функциональность с помощью curl и wget следующим образом:

curl --header "MD5: abcd" -F "[email protected] http://localhost:8080/abcd.html"

wget --header="MD5: abcd" --post-data='{"imei":"351553012623446","hni":"310150","wdp":false}' http://localhost:8080/abcd.html"

Но while ( (bytesRead = bufferedReader.read(charBuffer)) != -1 ) ничего не возвращает, и поэтому я ничего не добавляю к StringBuffer.

67 голосов | спросил patel bhavin 12 62011vEurope/Moscow11bEurope/MoscowSat, 12 Nov 2011 02:16:18 +0400 2011, 02:16:18

6 ответов


0

В Java 8 вы можете сделать это более простым и понятным способом:

if ("POST".equalsIgnoreCase(request.getMethod())) 
{
   test = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
}
ответил abhi 6 AM00000090000003131 2015, 09:28:31
0

Имейте в виду, что ваш код довольно шумный. Я знаю, что ветка старая, но многие все равно ее прочтут. Вы можете сделать то же самое, используя библиотеку guava с:

    if ("POST".equalsIgnoreCase(request.getMethod())) {
        test = CharStreams.toString(request.getReader());
    }
ответил afx 18 Jpm1000000pmFri, 18 Jan 2013 20:10:29 +040013 2013, 20:10:29
0

Простой способ с помощью обыкновенных вещей.

IOUtils.toString(request.getReader());

https: //commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/IOUtils.html

ответил Dani 26 AM000000100000002831 2016, 10:18:28
0

Если вам нужно только тело запроса POST, вы можете использовать такой метод:

static String extractPostRequestBody(HttpServletRequest request) throws IOException {
    if ("POST".equalsIgnoreCase(request.getMethod())) {
        Scanner s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";
    }
    return "";
}

Сообщите: https://stackoverflow.com/a/5445161/1389219

ответил vegemite4me 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 05 Sep 2013 13:36:58 +0400 2013, 13:36:58
0

Если тело запроса пустое, то это просто означает, что оно уже было использовано заранее. Например, по request.getParameter() , getParameterValues() или getParameterMap() позвоните. Просто удалите строки, выполняющие эти вызовы, из вашего кода.

ответил BalusC 12 62011vEurope/Moscow11bEurope/MoscowSat, 12 Nov 2011 03:45:30 +0400 2011, 03:45:30
0

Это работает как для GET, так и для POST:

@Context
private HttpServletRequest httpRequest;


private void printRequest(HttpServletRequest httpRequest) {
    System.out.println(" \n\n Headers");

    Enumeration headerNames = httpRequest.getHeaderNames();
    while(headerNames.hasMoreElements()) {
        String headerName = (String)headerNames.nextElement();
        System.out.println(headerName + " = " + httpRequest.getHeader(headerName));
    }

    System.out.println("\n\nParameters");

    Enumeration params = httpRequest.getParameterNames();
    while(params.hasMoreElements()){
        String paramName = (String)params.nextElement();
        System.out.println(paramName + " = " + httpRequest.getParameter(paramName));
    }

    System.out.println("\n\n Row data");
    System.out.println(extractPostRequestBody(httpRequest));
}

static String extractPostRequestBody(HttpServletRequest request) {
    if ("POST".equalsIgnoreCase(request.getMethod())) {
        Scanner s = null;
        try {
            s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return s.hasNext() ? s.next() : "";
    }
    return "";
}
ответил Bruno Marinho 29 Maypm15 2015, 22:57:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132