HttpServletRequest get JSON POST data [duplicate]
Asked Answered
L

2

166

I am HTTP POST-ing to URL http://laptop:8080/apollo/services/rpc?cmd=execute

with POST data

{ "jsondata" : "data" }

Http request has Content-Type of application/json; charset=UTF-8

How do I get the POST data (jsondata) from HttpServletRequest?

If I enumerate the request params, I can only see one param, which is "cmd", not the POST data.

Lectra answered 30/9, 2010 at 14:41 Comment(4)
This is simple method to get request data request.getReader().lines().collect(Collectors.joining())Maduro
the above mentioned throws stream already closed exceptionThyestes
If you use the getReader() the stream will get closed, since originally it can only be read once. There are a number of alternatives on Wrapper implementations to allow multiple calls to getReader()Uraeus
The easiest way you can solve this is using Jackson's ObjectMapper. Its overloaded method readValue has a variation which accepts a Reader and a Class<T>. What you end up with is: new ObjectMapper().readValue(request.getReader(), YourBodyType.class) - and there you have it. Short and slick.Thermophone
E
282

Normaly you can GET and POST parameters in a servlet the same way:

request.getParameter("cmd");

But only if the POST data is encoded as key-value pairs of content type: "application/x-www-form-urlencoded" like when you use a standard HTML form.

If you use a different encoding schema for your post data, as in your case when you post a json data stream, you need to use a custom decoder that can process the raw datastream from:

BufferedReader reader = request.getReader();

Json post processing example (uses org.json package )

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...
}
Everglades answered 30/9, 2010 at 14:53 Comment(10)
It seems like you can only get the post data from request.getReader once. Is this true? When I tried this myself, subsequent calls to get the post-data of the request fail.Friede
That's correct you can read the request body content only once.Everglades
this really saved my day...but what is getReader and how do the json data get populated there? is it specifically for JSON? or any other object ? any helpful links please.Freesia
Why not just to pass getReader() to json parser as here: https://mcmap.net/q/151471/-retrieving-json-object-literal-from-httpservletrequest ? This wouldn't require extra copy loop.Hasheem
JSONObject jsonObject = HTTP.toJSONObject(jb.toString()); toJSONObject must have been moved to be a static method in the org.json.HTTP classCatchall
Why I cannot find the fromObject(String string) method inside the documentation? json.org/javadoc/org/json/JSONObject.htmlWoodworking
@X.Li, see the comment directly above yours.Buffy
You can use StringBuilder here, and you need close reader in finally block. Just in case :)Jugoslavia
Should be: JSONObject jsonObject = new JSONObject(jb.toString());Polled
get POST body BufferedReader reader = request.getReader();Margret
S
-3

Are you posting from a different source (so different port, or hostname)? If so, this very very recent topic I just answered might be helpful.

The problem was the XHR Cross Domain Policy, and a useful tip on how to get around it by using a technique called JSONP. The big downside is that JSONP does not support POST requests.

I know in the original post there is no mention of JavaScript, however JSON is usually used for JavaScript so that's why I jumped to that conclusion

Seymourseys answered 30/9, 2010 at 14:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.