HttpServletRequest 获取 JSON POST 数据

我是 HTTP POST-ing 到 URL HTTP://laptop:8080/apollo/services/rpc?cmd=execute

和 POST 数据

{ "jsondata" : "data" }

HTTP 请求的 Content-Type 为 application/json; charset=UTF-8

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

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

435315 次浏览

您是否从不同的来源(如此不同的端口或主机名)发帖?如果是这样的话,我刚刚回答的这个非常非常近期的话题可能会有所帮助。

问题在于 XHR 跨域策略,以及如何使用一种名为 JSONP 的技术绕过它的有用提示。最大的缺点是 JSONP 不支持 POST 请求。

我知道在最初的文章中没有提到 JavaScript,但是 JSON 通常用于 JavaScript,所以这就是为什么我跳到这个结论

通常,在 servlet 中 GET 和 POST 参数的方法是相同的:

request.getParameter("cmd");

但是,只有当 POST 数据是 编码作为内容类型的键-值对时,才使用类似于使用标准 HTML 表单时的“ application/x-www-form-urlencode”。

如果您对发布的数据使用不同的编码模式,比如在发布 Json 数据流时,您需要使用一个自定义解码器,该解码器可以从以下位置处理原始数据流:

BufferedReader reader = request.getReader();

Json 后处理示例(使用 Org.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...
}