122

我有一个 javascript 库正在向我的 Java servlet 发送 POST 请求,但是在该doPost方法中,我似乎无法获取请求有效负载的内容。在 chrome 开发者工具中,所有内容都在 headers 选项卡的 Request Payload 部分中,并且内容在那里,我知道 doPost 方法正在接收 POST,但它只是空白。

对于HttpServletRequest 对象,我可以通过什么方式获取请求有效负载中的数据?

request.getParameter()request.getAttributes() 两者都没有数据

4

9 回答 9

114

简单回答:
使用 getReader() 读取请求正文

更多信息:
有两种方法可以读取正文中的数据:

  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

您可以从请求中使用 Buffer Reader 来读取

    // 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

Java 8 流

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

使用Apache Commons IO,您可以在一行中完成此操作。

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

如果正文的内容是 Java 8 中的字符串,您可以执行以下操作:

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" }

在 servlet 中读取有效负载的代码(需要 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 回答