从Java servlet中的POST请求获取请求有效负载

时间:2013-01-25 16:24:31

标签: java http servlets post

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

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

执行request.getParameter()request.getAttributes() 最终都没有数据

8 个答案:

答案 0 :(得分:93)

简单回答:
使用getReader()来读取请求的主体

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

  1. getReader()会返回BufferedReader,以便您阅读请求正文。

  2. 如果您需要读取二进制数据,
  3. getInputStream()会返回ServletInputStream

  4. 来自文档的注释:“可以调用[任一方法]来读取正文,而不是两者。”

答案 1 :(得分:61)

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

答案 2 :(得分:48)

您可以根据请求使用Buffer Reader来阅读

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

答案 3 :(得分:33)

Java 8流

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

答案 4 :(得分:17)

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

IOUtils.toString(request.getReader())

答案 5 :(得分:3)

如果您能够以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。

答案 6 :(得分: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);
    }
}

答案 7 :(得分:1)

使用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);
        }
    }