Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I am trying to send a JSON Post request using Android Volley library but I dont seem to get the body of the json right and I get undefined body parameters on my web server. I need the json's parameters body to be a single object "name=someVal&comment=someOtherVal". name and comment are the keys and someVal and someOtherVal are the values.

String spreadsheetID = "1111111-11111N92RT9h-11111111111111111111111111111";
String url = "https://script.google.com/macros/s/" + spreadsheetID + "/exec";
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
// Request a string response from the provided URL.
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
        url, null,
        new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
    Log.d("JSONPost", response.toString());
    //pDialog.hide();
        }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        VolleyLog.d("JSONPost", "Error: " + error.getMessage());
        //pDialog.hide();
    @Override
    protected Map<String, String> getParams() {
        Map<String, String> params = new HashMap<String, String>();
        params.put("name=someVal&comment=someOtherVal");
        //params.put("comment", "someOtherVal");
        return params;
// Add the request to the RequestQueue.
queue.add(jsonObjReq);

I also tried this in the above code but no luck:

params.put("comment", "someOtherVal");
params.put("name", "someVal");
Map<String, String> params = new HashMap<String, String>();
params.put("comment", "someOtherVal");
params.put("name", "someVal");

before JsonObjectRequest jsonObjReq ... and change the null value by

new JsonObject(params)

so your code will be

Map<String, String> params = new HashMap<String, String>();
    params.put("comment", "someOtherVal");
    params.put("name", "someVal");
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
        url, new JsonObject(params),
        new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
    Log.d("JSONPost", response.toString());
    //pDialog.hide();
        }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        VolleyLog.d("JSONPost", "Error: " + error.getMessage());
        //pDialog.hide();
                I had that problem the only solution i tried is changing the library, i used retrofit instead of volley and everything goes right
– Oussema Aroua
                May 8, 2016 at 14:37
                I actuary tried with URL connection library and it works but lets leave it as other people may run into the same problem.
– Amir
                May 8, 2016 at 14:51

It seems Google Spreadsheet was preferring this format:

String spreadsheetID = "111111-111111111D746wspoleBbRN92RT9h-111111";
        String url = "https://script.google.com/macros/s/" + spreadsheetID + "/exec";
        // Instantiate the RequestQueue.
        RequestQueue queue = Volley.newRequestQueue(this);
        StringRequest sr = new StringRequest(Request.Method.POST,url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            @Override
            protected Map<String,String> getParams(){
                Map<String,String> params = new HashMap<String, String>();
                params.put("name","userAccount.getUsername()");
                params.put("comment","userAccount.getPassword()");
                return params;
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String,String> params = new HashMap<String, String>();
                params.put("Content-Type","application/x-www-form-urlencoded");
                return params;
        queue.add(sr);

If you need to send a JSON POST then you should dump the http.HEADERS and the http.WIRE and you should probably see ....

 "Content-Type: application/json"   // among headers
   {"name":"someVal","comment":"someOtherVal"}   // in the POST.body 

Find out how to log header and log wire in Volley....

Think about testing a POST using CURL on the CLI where adding the -v switch will show you the details. Then , what works in curl you move that verbatim to your android, http client and it will work.

android WIRE , HEADER logging session example using non-volley client with full logging pastebin.com/7eU9GUKV – Robert Rowntree May 8, 2016 at 13:51

This worked for me, I am sending a request to an Express server which uses express.json(). The object I am sending in the body is called user and looks like this:

String: username; String: password;
 RequestQueue queue = Volley.newRequestQueue(this);
 // user object that we need to send
 JSONObject userJson = new JSONObject();
 // body of the request
 JSONObject body = new JSONObject();
 try {
    // Put user attributes in a JSONObject
    userJson.put("username", "username value");
    userJson.put("password", "password value");
    // Put user JSONObject inside of another JSONObject which will be the body of the request     
    body.put("user", userJson);
 } catch (JSONException e) {
    e.printStackTrace();
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
                    Request.Method.POST, 
                    body,
                    response -> {
                        // Handle response
                    }, e -> {
                        // handle error
 queue.add(jsonObjectRequest);
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.