Ich habe eine Javascript-Bibliothek, die eine POST-Anforderung an mein Java-Servlet sendet, aber in der doPost
Methode kann ich den Inhalt der Anforderungsnutzdaten nicht abrufen. In den Chrome Developer Tools befindet sich der gesamte Inhalt im Abschnitt "Payload anfordern" auf der Registerkarte "Header" und der Inhalt ist dort. Ich weiß, dass der POST von der doPost-Methode empfangen wird, aber er wird nur leer angezeigt.
HttpServletRequest
Wie kann ich für das Objekt die Daten in der Anforderungsnutzlast abrufen?
Tun request.getParameter()
oder request.getAttributes()
beide Ende ohne Daten auf
Antworten:
Einfache Antwort:
Verwenden Sie getReader (), um den Text der Anforderung zu lesen
Weitere Informationen:
Es gibt zwei Methoden zum Lesen der Daten im Körper:
getReader()
Gibt einen BufferedReader zurück , mit dem Sie den Hauptteil der Anforderung lesen können.getInputStream()
Gibt einen ServletInputStream zurück, wenn Sie Binärdaten lesen müssen.Anmerkung aus den Dokumenten: "[Jede Methode] kann aufgerufen werden, um den Textkörper zu lesen, nicht beide."
quelle
Mit dieser Methode
quelle
request.getInputStream()
die Codierung von Anforderungszeichen nicht berücksichtigtrequest.getReader()
wird. In diesem Beispiel wird also der Standard-Systemzeichensatz verwendet.new BufferedReader(new InputStreamReader(request.getInputStream()))
könnte vereinfacht werden, damit nurrequest.getReader()
das bereits gepuffert ist und auch die Anforderungscodierung erhalten bleibt.javax.servlet.ServletException: java.lang.IllegalStateException: getInputStream() has already been called for this request
Als ich getReader () aufrief, weil der Reader bereits geöffnet war.Sie können den Buffer Reader von der Anforderung zum Lesen verwenden
quelle
Java 8-Streams
quelle
(accumulator, actual) -> accumulator + actual
mitString::concat
.Mit Apache Commons IO können Sie dies in einer Zeile tun.
quelle
Wenn der Inhalt des Körpers in Java 8 eine Zeichenfolge ist, können Sie Folgendes tun:
String body = request.getReader().lines().collect(Collectors.joining());
quelle
Wenn Sie die Nutzdaten in JSON senden können, ist dies die bequemste Methode zum Lesen der Wiedergabe:
Beispieldatenklasse:
Beispielnutzlast (Anforderungshauptteil):
Code zum Lesen der Nutzdaten im Servlet (erfordert com.google.gson. *):
Das ist alles. Schön, einfach und sauber. Vergessen Sie nicht, den Header für den Inhaltstyp auf application / json zu setzen.
quelle
Verwenden Sie Java 8 mit Ressourcen:
quelle
Du brauchst nur
zum Abrufen der POST- und GET-Parameter.
Die Methode gibt a zurück
Map<String,String[]>
.Sie können die Parameter in der Karte von lesen
quelle
application/x-www-form-urlencoded
. fürmultipart/form-data
, müssen Sie offensichtlich den Körperteil durch den Zugriff aufrequest.getReader()
manuell und analysieren.