Java HttpServletRequest获取JSON POST数据
我正在HTTP发布到URLhttp://laptop:8080/apollo/services/rpc?cmd=execute 与 发布数据Java HttpServletRequest获取JSON POST数据,java,json,post,servlets,Java,Json,Post,Servlets,我正在HTTP发布到URLhttp://laptop:8080/apollo/services/rpc?cmd=execute 与 发布数据 {“jsondata”:“data”} Http请求的内容类型为application/json;字符集=UTF-8 如何从HttpServletRequest获取POST数据(jsondata) 如果我枚举请求参数,我只能看到一个参数, 哪个是“cmd”,而不是POST数据。您是从不同的来源(不同的端口或主机名)发布的吗?如果是这样,我刚才回答的这个最
{“jsondata”:“data”}
Http请求的内容类型为application/json;字符集=UTF-8
如何从HttpServletRequest获取POST数据(jsondata)
如果我枚举请求参数,我只能看到一个参数,
哪个是“cmd”,而不是POST数据。您是从不同的来源(不同的端口或主机名)发布的吗?如果是这样,我刚才回答的这个最近的话题可能会有所帮助
我知道在最初的帖子中没有提到JavaScript,但是JSON通常用于JavaScript,这就是为什么我得出这样的结论通常你可以用同样的方式在servlet中获取和发布参数:
request.getParameter("cmd");
但仅当POST数据作为内容类型的键值对时:“application/x-www-form-urlencoded”就像使用标准HTML表单一样。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
StringBuffer jb = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null)
jb.append(line);
} catch (Exception e) { /*report an error*/ }
try {
JSONObject jsonObject = HTTP.toJSONObject(jb.toString());
} catch (JSONException e) {
// crash and burn
throw new IOException("Error parsing JSON request string");
}
// Work with the data using methods like...
// int someInt = jsonObject.getInt("intParamName");
// String someString = jsonObject.getString("stringParamName");
// JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName");
// JSONArray arr = jsonObject.getJSONArray("arrayParamName");
// etc...
}
如果对post数据使用不同的编码模式,如发布json数据流时,则需要使用可从以下位置处理原始数据流的自定义解码器:
BufferedReader reader = request.getReader();
Json后处理示例(使用包)
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
StringBuffer jb = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null)
jb.append(line);
} catch (Exception e) { /*report an error*/ }
try {
JSONObject jsonObject = HTTP.toJSONObject(jb.toString());
} catch (JSONException e) {
// crash and burn
throw new IOException("Error parsing JSON request string");
}
// Work with the data using methods like...
// int someInt = jsonObject.getInt("intParamName");
// String someString = jsonObject.getString("stringParamName");
// JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName");
// JSONArray arr = jsonObject.getJSONArray("arrayParamName");
// etc...
}
似乎您只能从request.getReader获取一次post数据。这是真的吗?当我自己尝试这一点时,获取请求post数据的后续调用失败;toJSONObject必须已被移动为org.json.HTTP类中的静态方法为什么在文档中找不到
fromObject(String String)
方法@X.Li,请看您上面的评论。这是获取请求数据的简单方法request.getReader().lines().collect(Collectors.joining())
上述抛出的流已经关闭,但如果使用getReader()
则流将关闭,因为最初只能读取一次。在包装器实现中有许多替代方法可以允许对getReader()
进行多次调用。解决这个问题的最简单方法是使用Jackson的ObjectMapper
。它的重载方法readValue
有一个变体,它接受读取器
和类
。最终得到的结果是:newObjectMapper().readValue(request.getReader(),YourBodyType.class)
——就在这里。又短又滑。