私のJavaサーブレットにPOSTリクエストを送信しているjavascriptライブラリがありますが、doPost
メソッドでリクエストペイロードの内容を取得できないようです。クロム開発者向けツールでは、すべてのコンテンツはヘッダタブのリクエストペイロードセクションにあり、コンテンツはそこにあります、そしてPOSTがdoPostメソッドによって受け取られていることを私は知っています、しかしそれはちょうど出ますブランク。
HttpServletRequest
オブジェクトの場合、リクエストペイロードのデータをどのように取得できますか?
request.getParameter()
またはrequest.getAttributes()
を実行すると、データがなくなってしまいます
簡単な答え:
getReader()を使ってリクエストの本文を読む
より詳しい情報:
本体のデータを読み取る方法は2つあります。
getReader()
は BufferedReader を返すので、リクエストの本文を読むことができます。
バイナリデータを読み込む必要がある場合は、 getInputStream()
が ServletInputStream を返します。
文書からのメモ:「[どちらの方法]も本体を読むために呼び出されるかもしれない、両方ではない」。
String payloadRequest = getBody(request);
この方法を使う
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;
}
あなたが読むために要求からバッファリーダーを使用することができます
// 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ストリーム
String body = request.getReader().lines()
.reduce("", (accumulator, actual) -> accumulator + actual);
Apache Commons IO を使用すると、これを1行で実行できます。
IOUtils.toString(request.getReader())
本体の内容がJava 8の文字列の場合は、次の操作を実行できます。
String body = request.getReader().lines().collect(Collectors.joining());
ペイロードをJSONで送信できる場合は、これがプレイロードを読むための最も便利な方法です。
データクラスの例:
public class Person {
String firstName;
String lastName;
// Getters and setters ...
}
ペイロードの例(リクエストボディ):
{ "firstName" : "John", "lastName" : "Doe" }
サーブレット内のペイロードを読み取るためのコード(com.google.gson。*が必要)
Person person = new Gson().fromJson(request.getReader(), Person.class);
それで全部です。いい、簡単、そしてきれい。 content-typeヘッダーをapplication/jsonに設定することを忘れないでください。
Java 8を使ってリソースを試してみてください。
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);
}
}
あなただけが必要です
request.getParameterMap()
POSTとGET - パラメータを取得します。
メソッドはMap<String,String[]>
を返します。
Mapのパラメータは次のようにして読むことができます。
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);
}
}