Reputation: 68995
I am making a POST request using curl as follows
curl -H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-X POST \
-d '{ "name": "PhoneName", "description": "Phone Description!", "details": { "imeiNumber": "123456789123456", "phoneNumber": "9999999999"}}' \
-k \
http://test.domain.com/myTestServer/devices
But in the servlet I am not able to get any of the data posted.
public void devices(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("Got Request for devices");
System.out.println("Request is : "+ request);
System.out.println("Name : " + request.getParameter("name")); //gives null
System.out.println("description : " + request.getParameter("description")); //gives null
Enumeration<String> paramNames = request.getParameterNames(); //Empty Enumeration
while(paramNames.hasMoreElements()){
String paramName = paramNames.nextElement();
System.out.println(paramName + " : " + request.getParameter(paramName));
}
}
Any suggestions? Also a better way to get data inside data like "details": { "imeiNumber": "123456789123456", "phoneNumber": "9999999999"}
?
Upvotes: 1
Views: 4131
Reputation: 46871
Any suggestions? Also a better way to get data inside data like "details": { "imeiNumber": "123456789123456", "phoneNumber": "9999999999"}
Sorry, I don't have any idea about curl, but I can help you to parse the JSON string using GSON library. Just enclose the above JSON string inside {...}
and parse it into Java object as illustrated in below sample code.
Sample code:
class Details {
private String name;
private String description;
private PhoneNumberDetails details;
// getter & setter
}
class PhoneNumberDetails{
private String imeiNumber;
private String phoneNumber;
// getter & setter
}
String json = "{ \"name\": \"PhoneName\", \"description\": \"Phone Description!\", \"details\": { \"imeiNumber\": \"123456789123456\", \"phoneNumber\": \"9999999999\"}}";
Details data = new Gson().fromJson(json, Details.class);
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));
output:
{
"name": "PhoneName",
"description": "Phone Description!",
"details": {
"imeiNumber": "123456789123456",
"phoneNumber": "9999999999"
}
}
Upvotes: 0
Reputation: 68715
-d '{ "name": "PhoneName", "description": "Phone Description!", "details": { "imeiNumber": "123456789123456", "phoneNumber": "9999999999"}}' \
pushes the input json into POST request payload. And you CANNOT simply unmarshall the input json attributes using their names and hence you get
System.out.println("Name : " + request.getParameter("name")); //gives null
null
values for such statements.
You need to read the POST request payload from your HttpServletRequest
object and then should use json parser to parse it to get the attribute values.
You can read the entire POST request payload like this:
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();
Now you should get your input json in variable body. Now use a json parser to get the attribues value, for example like this:
JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(body).getAsJsonObject();
String name = obj.get("name").toString();
Upvotes: 6