Aniket Thakur
Aniket Thakur

Reputation: 68995

Extract data from Curl POST request

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

Answers (2)

Braj
Braj

Reputation: 46871

Any suggestions? Also a better way to get data inside data like "details": { "imeiNumber": "123456789123456", "phoneNumber": "9999999999"}

It's a Suggestion, don't treat it as Solution

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

Juned Ahsan
Juned Ahsan

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

Related Questions