web-dev-qa-db-ja.com

JavaサーブレットのPOST requestからリクエストペイロードを取得する

私のJavaサーブレットにPOSTリクエストを送信しているjavascriptライブラリがありますが、doPostメソッドでリクエストペイロードの内容を取得できないようです。クロム開発者向けツールでは、すべてのコンテンツはヘッダタブのリクエストペイロードセクションにあり、コンテンツはそこにあります、そしてPOSTがdoPostメソッドによって受け取られていることを私は知っています、しかしそれはちょうど出ますブランク。

HttpServletRequestオブジェクトの場合、リクエストペイロードのデータをどのように取得できますか?

request.getParameter()またはrequest.getAttributes()を実行すると、データがなくなってしまいます

93
Fasih Awan

簡単な答え:
getReader()を使ってリクエストの本文を読む

より詳しい情報:
本体のデータを読み取る方法は2つあります。

  1. getReader()BufferedReader を返すので、リクエストの本文を読むことができます。

  2. バイナリデータを読み込む必要がある場合は、 getInputStream()ServletInputStream を返します。

文書からのメモ:「[どちらの方法]も本体を読むために呼び出されるかもしれない、両方ではない」。

94
davidfrancis
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;
}
61

あなたが読むために要求からバッファリーダーを使用することができます

    // 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ストリーム

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

Apache Commons IO を使用すると、これを1行で実行できます。

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

本体の内容がJava 8の文字列の場合は、次の操作を実行できます。

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

7
Lloyd Rochester

ペイロードを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に設定することを忘れないでください。

3
Harry Developer

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);
        }
    }
1
Timothy Heider

あなただけが必要です

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);
    }
}
1
Arol