我有一个javascript库正在向我的Java servlet发送POST请求,但是在doPost
方法中,我似乎无法获取请求有效负载的内容。在chrome Developer Tools中,所有内容都在headers选项卡的Request Payload部分中,内容就在那里,我知道doPost方法正在接收POST,但它只是空白。
HttpServletRequest
对象,我可以通过什么方式获取请求有效负载中的数据?
执行request.getParameter()
或request.getAttributes()
最终都没有数据
答案 0 :(得分:93)
简单回答:
使用getReader()来读取请求的主体
更多信息:
有两种方法可以读取正文中的数据:
getReader()
会返回BufferedReader,以便您阅读请求正文。
来自文档的注释:“可以调用[任一方法]来读取正文,而不是两者。”
答案 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);
}
}