web-dev-qa-db-de.com

Abrufen von Anforderungsnutzdaten von POST request in Java servlet

Ich habe eine Javascript-Bibliothek, die eine POST -Anforderung an mein Java -Servlet sendet, aber in der doPost -Methode kann ich den Inhalt der anscheinend nicht abrufen Nutzlast anfordern. In chrome Developer Tools befindet sich der gesamte Inhalt im Abschnitt "Request Payload" (Nutzdaten anfordern) auf der Registerkarte "Headers" (Überschriften), und der Inhalt befindet sich dort. Ich weiß, dass das POST von der doPost-Methode empfangen wird , aber es kommt einfach leer.

Wie kann ich für das Objekt HttpServletRequest die Daten in der Anforderungsnutzlast abrufen?

Wenn Sie request.getParameter() oder request.getAttributes() ausführen, erhalten beide keine Daten

95
Fasih Awan

Einfache antwort:
Verwenden Sie getReader (), um den Text der Anforderung zu lesen

Mehr Info:
Es gibt zwei Methoden zum Lesen der Daten im Körper:

  1. getReader() gibt einen BufferedReader zurück, mit dem Sie den Text der Anforderung lesen können.

  2. getInputStream() gibt ServletInputStream zurück, wenn Sie Binärdaten lesen müssen.

Hinweis aus den Dokumenten: "[Jede Methode] kann aufgerufen werden, um den Text zu lesen, nicht beide."

96
davidfrancis
String payloadRequest = getBody(request);

Mit dieser Methode

public static String getBody(HttpServletRequest request) throws IOException {

    String body = null;
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;

    try {
        InputStream inputStream = request.getInputStream();
        if (inputStream != null) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            char[] charBuffer = new char[128];
            int bytesRead = -1;
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                stringBuilder.append(charBuffer, 0, bytesRead);
            }
        } else {
            stringBuilder.append("");
        }
    } catch (IOException ex) {
        throw ex;
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ex) {
                throw ex;
            }
        }
    }

    body = stringBuilder.toString();
    return body;
}
61

Sie können den Buffer Reader von request zum Lesen verwenden

    // Read from request
    StringBuilder buffer = new StringBuilder();
    BufferedReader reader = request.getReader();
    String line;
    while ((line = reader.readLine()) != null) {
        buffer.append(line);
    }
    String data = buffer.toString()
48
Fizer Khan

Java 8-Streams

String body = request.getReader().lines()
    .reduce("", (accumulator, actual) -> accumulator + actual);
34
bbviana

Mit Apache Commons IO können Sie dies in einer Zeile tun.

IOUtils.toString(request.getReader())
18
Diji Adeyemo

Wenn der Inhalt des Körpers ein String in Java 8 ist, können Sie Folgendes tun:

String body = request.getReader().lines().collect(Collectors.joining());

7
Lloyd Rochester

Wenn Sie die Payload in JSON senden können, ist dies die bequemste Methode, um die Playload zu lesen:

Beispiel Datenklasse:

public class Person {
    String firstName;
    String lastName;
    // Getters and setters ...
}

Beispiel Payload (Request Body):

{ "firstName" : "John", "lastName" : "Doe" }

Code zum Lesen der Nutzdaten im Servlet (erfordert com.google.gson. *):

Person person = new Gson().fromJson(request.getReader(), Person.class);

Das ist alles. Schön, einfach und sauber. Vergessen Sie nicht, den Content-Type-Header auf application/json zu setzen.

3
Harry Developer

Verwenden Sie Java 8 und versuchen Sie es mit Ressourcen:

    StringBuilder stringBuilder = new StringBuilder();
    try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()))) {
        char[] charBuffer = new char[1024];
        int bytesRead;
        while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
            stringBuilder.append(charBuffer, 0, bytesRead);
        }
    }
2
Timothy Heider

Du brauchst nur

request.getParameterMap ()

um die POST und GET - Parameter zu erhalten.

Die Methode liefert ein Map<String,String[]>.

Sie können die Parameter in der Map nachlesen

Map<String, String[]> map = request.getParameterMap();
//Reading the Map
//Works for GET && POST Method
for(String paramName:map.keySet()) {
    String[] paramValues = map.get(paramName);

    //Get Values of Param Name
    for(String valueOfParam:paramValues) {
        //Output the Values
        System.out.println("Value of Param with Name "+paramName+": "+valueOfParam);
    }
}
1
Arol