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
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:
getReader()
gibt einen BufferedReader zurück, mit dem Sie den Text der Anforderung lesen können.
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."
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;
}
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()
Java 8-Streams
String body = request.getReader().lines()
.reduce("", (accumulator, actual) -> accumulator + actual);
Mit Apache Commons IO können Sie dies in einer Zeile tun.
IOUtils.toString(request.getReader())
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());
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.
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);
}
}
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);
}
}