122

POSTリクエストをJavaサーブレットに送信しているjavascriptライブラリがありますが、doPostメソッドでは、リクエストペイロードの内容を取得できないようです。Chromeデベロッパーツールでは、すべてのコンテンツが[ヘッダー]タブの[ペイロードのリクエスト]セクションにあり、コンテンツがそこにあります。POSTがdoPostメソッドによって受信されていることはわかっていますが、空白になっています。

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

実行するrequest.getParameter()request.getAttributes() 、両方を実行すると、データがなくなります

4

9 に答える 9

114

簡単な答え:
getReader()を使用してリクエストの本文を読み取ります

詳細:
本文のデータを読み取るには、次の2つの方法があります。

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

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

ドキュメントからのメモ:「[どちらかのメソッド]は、両方ではなく、本文を読み取るために呼び出される場合があります。」

于 2013-01-25T16:28:33.597 に答える
78
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;
}
于 2013-02-14T23:27:54.100 に答える
58

リクエストからバッファリーダーを使用して読み取ることができます

    // Read from request
    StringBuilder buffer = new StringBuilder();
    BufferedReader reader = request.getReader();
    String line;
    while ((line = reader.readLine()) != null) {
        buffer.append(line);
        buffer.append(System.lineSeparator());
    }
    String data = buffer.toString()
于 2014-09-02T06:44:04.453 に答える
42

Java8ストリーム

String body = request.getReader().lines()
    .reduce("", (accumulator, actual) -> accumulator + actual);
于 2015-02-07T00:20:53.393 に答える
31

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

IOUtils.toString(request.getReader())
于 2016-09-30T13:04:27.673 に答える
22

本文の内容がJava8の文字列である場合、次のことができます。

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

于 2017-08-11T12:51:48.833 に答える
7

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

于 2018-01-25T19:54:53.100 に答える
2

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);
        }
    }
于 2017-07-31T18:43:00.590 に答える
1

必要なのは

request.getParameterMap()

POSTおよびGET-パラメータを取得するため。

メソッドはを返しますMap<String,String[]>

マップ内のパラメータは、次の方法で読み取ることができます。

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);
    }
}
于 2016-11-14T11:13:14.037 に答える