webentwicklung-frage-antwort-db.com.de

Bekommen das POST fordern Sie Body von HttpServletRequest an

Ich versuche, den gesamten Körper aus dem HttpServletRequest-Objekt abzurufen.

Der Code, den ich folge, sieht so aus:

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();
}

und ich teste die Funktionalität mit curl und wget wie folgt:

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"

Aber die while ( (bytesRead = bufferedReader.read(charBuffer)) != -1 ) gibt nichts zurück und ich bekomme nichts an StringBuffer angehängt.

71
patel bhavin

In Java 8 ist dies einfacher und sauberer möglich:

if ("POST".equalsIgnoreCase(request.getMethod())) 
{
   test = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
}
116
abhi

Beachten Sie, dass Ihr Code ziemlich laut ist. Ich weiß, dass der Thread alt ist, aber viele Leute werden ihn trotzdem lesen. Sie können dasselbe mit der guava Bibliothek machen mit:

    if ("POST".equalsIgnoreCase(request.getMethod())) {
        test = CharStreams.toString(request.getReader());
    }
25
afx

Einfacher Weg mit Commons-Io.

IOUtils.toString(request.getReader());

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

24
Dani

Wenn Sie nur den Anforderungstext POST wünschen, können Sie eine Methode wie die folgende verwenden:

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 "";
}

Kredit an: https://stackoverflow.com/a/5445161/1389219

17
vegemite4me

Wenn der Anfragetext leer ist, bedeutet dies lediglich, dass er bereits zuvor verbraucht wurde. Zum Beispiel durch einen request.getParameter() , getParameterValues() oder getParameterMap() call. Entfernen Sie einfach die Leitungen für diese Anrufe aus Ihrem Code.

7
BalusC

Dies funktioniert sowohl für GET als auch für 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 "";
}
4
Bruno Marinho

Ich habe diese Situation auf diese Weise gelöst. Mit der readValue-Methode von ObjectMapper, die einen Reader empfangen kann, habe ich eine util-Methode erstellt, die ein Objekt zurückgibt, das aus dem Anforderungshauptteil extrahiert wurde.

public static <T> T getBody(ResourceRequest request, Class<T> class) {
    T objectFromBody = null;
    try {
        ObjectMapper objectMapper = new ObjectMapper();
        HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest(request);
        objectFromBody = objectMapper.readValue(httpServletRequest.getReader(), class);
    } catch (IOException ex) {
        log.error("Error message", ex);
    }
    return objectFromBody;
}
0

Dies funktioniert für alle HTTP-Methoden. 

public class HttpRequestWrapper extends HttpServletRequestWrapper {
    private final String body;

    public HttpRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        body = IOUtils.toString(request.getReader());
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(getBody().getBytes());
        ServletInputStream servletInputStream = new ServletInputStream() {
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener listener) {
            }

        };
        return servletInputStream;
    }

    public String getBody() {
        return this.body;
    }
}
0
Bhawna Joshi