Java HttpServletRequest获取JSON POST数据

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数据。您是从不同的来源(不同的端口或主机名)发布的吗?如果是这样,我刚才回答的这个最

我正在HTTP发布到URLhttp://laptop:8080/apollo/services/rpc?cmd=execute

与 发布数据

{“jsondata”:“data”}
Http请求的内容类型为
application/json;字符集=UTF-8

如何从HttpServletRequest获取POST数据(jsondata)

如果我枚举请求参数,我只能看到一个参数,
哪个是“cmd”,而不是POST数据。

您是从不同的来源(不同的端口或主机名)发布的吗?如果是这样,我刚才回答的这个最近的话题可能会有所帮助

问题在于XHR跨域策略,以及如何使用JSONP技术绕过它的有用提示。最大的缺点是JSONP不支持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)
——就在这里。又短又滑。