Ich versuche, den gesamten Körper aus dem HttpServletRequest-Objekt abzurufen.
Der Code, dem ich folge, sieht folgendermaßen 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 das while ( (bytesRead = bufferedReader.read(charBuffer)) != -1 )
gibt nichts zurück und so bekomme ich nichts an StringBuffer angehängt.
getReader
bereits aufgerufenen Anfragetext nicht erneut lesen können .Einfacher Weg mit Commons-Io.
https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/IOUtils.html
quelle
Beachten Sie, dass Ihr Code ziemlich laut ist. Ich weiß, dass der Thread alt ist, aber viele Leute werden ihn trotzdem lesen. Mit der Guavenbibliothek können Sie dasselbe tun mit:
quelle
if(RequestMethod.POST.name().equalsIgnoreCase(...)) { ... }
Wenn Sie nur den POST-Anforderungshauptteil möchten, können Sie eine Methode wie die folgende verwenden:
Gutschrift an: https://stackoverflow.com/a/5445161/1389219
quelle
request.getInputStream()
die Codierung von Anforderungszeichen nicht berücksichtigtrequest.getReader()
wird. +1 für den Link.Dies funktioniert sowohl für GET als auch für POST:
quelle
Wenn der Anforderungshauptteil leer ist, bedeutet dies einfach, dass er bereits zuvor verbraucht wurde. Zum Beispiel von einem
request.getParameter()
,getParameterValues()
odergetParameterMap()
Anruf. Entfernen Sie einfach die Leitungen, die diese Anrufe tätigen, aus Ihrem Code.quelle
curl
Beispiel, nein?Dies funktioniert für alle HTTP-Methoden.
quelle
Ich habe diese Situation auf diese Weise gelöst. Ich habe eine util-Methode erstellt, die ein aus dem Anforderungshauptteil extrahiertes Objekt zurückgibt. Dabei habe ich die readValue-Methode von ObjectMapper verwendet, die einen Reader empfangen kann.
quelle