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

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

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

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

344441 次浏览

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

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

  1. 返回一个 BufferedReader,它允许您读取请求的正文。

  2. 如果需要读取二进制数据,则返回 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);
buffer.append(System.lineSeparator());
}
String data = buffer.toString()

Java8流

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

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

IOUtils.toString(request.getReader())

你只需要

GetParameter terMap ()

获取 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);
}
}

使用 Java8尝试使用资源:

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

如果主体的内容是 Java8中的字符串,则可以:

String body = request.getReader () . lines () . Collection (Collectors.join ()) ;

如果你能够在 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);

就是这样。漂亮、简单、干净。别忘了将内容类型的头部设置为 application/json。