How to send a POST request with JSON body using Volley?
Asked Answered
I

3

12

How to pass these parameter into POST method using Volley library.

API link: http://api.wego.com/flights/api/k/2/searches?api_key=12345&ts_code=123
Screenshot of JSON structure

I tried this but again facing error.

StringEntity params= new StringEntity ("{\"trip\":\"[\"{\"departure_code\":\","
                     +departure,"arrival_code\":\"+"+arrival+","+"outbound_date\":\","
                     +outbound,"inbound_date\":\","+inbound+"}\"]\"}");
request.addHeader("content-type", "application/json");
request.addHeader("Accept","application/json");

Please visit here for the details of API.

Irenairene answered 17/10, 2016 at 5:40 Comment(9)
quick tip: switch to Okhttp or retrofit, volley is slower and would be hard from a beginner's perspective, while okhttp would be easier for you!Isogonic
What you need to do is to pass the json as body in the post request using okhttp, let me know if this helps you : https://mcmap.net/q/233782/-okhttp-post-body-as-jsonIsogonic
If you insist on using Volley itself, you can refer this question too: #23221195Isogonic
@superman thanks . I'll tryIrenairene
Solved the problem?Isogonic
@superman no :(Irenairene
try { HttpPost request = new HttpPost("api.wego.com/flights/api/k/2/…); StringEntity params =new StringEntity("{\"trip\":\"[\"{\"departure_code\":\",",departure,"arrival_code\":\",",arrival,"outbound_date\":\",",outbound,"inbound_date\":\",",inbound,"}\"""]"); request.addHeader("content-type", "application/json"); request.setEntity(params); HttpResponse response = httpClient.execute(request); }Irenairene
what's your email?Isogonic
email-id [email protected]Irenairene
D
36

Usual way is to use a HashMap with Key-value pair as request parameters with Volley

Similar to the below example, you need to customize for your specific requirement.

Option 1:

final String URL = "URL";
// Post params to be sent to the server
HashMap<String, String> params = new HashMap<String, String>();
params.put("token", "token_value");
params.put("login_id", "login_id_value");
params.put("UN", "username");
params.put("PW", "password");

JsonObjectRequest request_json = new JsonObjectRequest(URL, new JSONObject(params),
       new Response.Listener<JSONObject>() {
           @Override
           public void onResponse(JSONObject response) {
               try {
                   //Process os success response
               } catch (JSONException e) {
                   e.printStackTrace();
               }
           }
       }, new Response.ErrorListener() {
           @Override
           public void onErrorResponse(VolleyError error) {
               VolleyLog.e("Error: ", error.getMessage());
           }
       });

// add the request object to the queue to be executed
ApplicationController.getInstance().addToRequestQueue(request_json);

NOTE: A HashMap can have custom objects as value

Option 2:

Directly using JSON in request body

try {
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    String URL = "http://...";
    JSONObject jsonBody = new JSONObject();
    jsonBody.put("firstkey", "firstvalue");
    jsonBody.put("secondkey", "secondobject");
    final String mRequestBody = jsonBody.toString();

    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.i("LOG_VOLLEY", response);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("LOG_VOLLEY", error.toString());
        }
    }) {
        @Override
        public String getBodyContentType() {
            return "application/json; charset=utf-8";
        }

        @Override
        public byte[] getBody() throws AuthFailureError {
            try {
                return mRequestBody == null ? null : mRequestBody.getBytes("utf-8");
            } catch (UnsupportedEncodingException uee) {
                VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", mRequestBody, "utf-8");
                return null;
            }
        }

        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            String responseString = "";
            if (response != null) {

                responseString = String.valueOf(response.statusCode);

            }
            return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response));
        }
    };

    requestQueue.add(stringRequest);
} catch (JSONException e) {
    e.printStackTrace();
}
Deandreadeane answered 17/10, 2016 at 6:29 Comment(11)
i just post these parameter in post methodIrenairene
{ "trips": [ { "departure_code": "SYD", "arrival_code": "LON", "outbound_date": "2014-01-24", "inbound_date": "2014-01-29" } ], "adults_count": 1, "locale": "ar" }Irenairene
@ Stallion yes i pass these parameter in post method ...check link its flight apiIrenairene
@ Stallion ur code work for me but little bit issue facing please help meIrenairene
What's the issue you are facing ? I guess if its the problem with JSON forming , then this solution will help. #37894924Deandreadeane
@ Stallion yes output :{"adults_count":"1","inbound_date":"2014-01-29","arrival_code":"LON","departure_code":"SYD","outbound_date":"2014-01-24"} but i want this output :- { "trips": [ { "departure_code": "SYD", "arrival_code": "LON", "outbound_date": "2014-01-24", "inbound_date": "2014-01-29" } ], "adults_count": 1 }Irenairene
@ Stallion Thanks alot Today you saved my life :) thank you so muchIrenairene
i got response status 200 not full response ..u can help me ?Irenairene
What do you mean by not full response ?Deandreadeane
thanks for reply .. now i got full response in json formatIrenairene
but can anyone tell me how can i see or debug API response in Logcat? i put Log.d("response",response.toString()) but not getting anything ... but Toast being shown with a response.Vanatta
Z
-1

this is an example uses StringRequest

    StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {  
    @Override  
    protected Map<String, String> getParams() throws AuthFailureError {  
        Map<String, String> map = new HashMap<String, String>();  
        map.put("api_key", "12345");  
        map.put("ts_code", "12345");  
        return map;  
    }  
}; 
Zurek answered 17/10, 2016 at 5:57 Comment(2)
How does this solve the problem? The body of the POST request is json.Isogonic
@Zurek i am not asking api_key and ts_code .api_key and ts_code add url link its working fine.. i am asking about json data like trip [ {}]Irenairene
M
-3
 OkHttpClient okHttpClient = new OkHttpClient();   
 ContentValues values = new ContentValues();
            values.put(parameter1Name, parameter1Value);
            values.put(parameter2Name, parameter2Value);

            RequestBody requestBody = null;

            if (values != null && values.size() > 0) {
                FormEncodingBuilder formEncoding = new FormEncodingBuilder();

                Set<String> keySet = values.keySet();
                for (String key : keySet) {
                    try {
                        values.getAsString(key);
                        formEncoding.add(key, values.getAsString(key));

                    } catch (Exception ex) {
                        Logger.log(Logger.LEVEL_ERROR, CLASS_NAME, "getRequestBodyFromParameters", "Error while adding Post parameter. Skipping this parameter." + ex.getLocalizedMessage());
                    }
                }
                requestBody = formEncoding.build();
            }

            String URL = "http://example.com";
            Request.Builder builder = new Request.Builder();
            builder.url(URL);
            builder.post(requestBody);
            Request request = builder.build();
            Response response = okHttpClient.newCall(request).execute();
Milldam answered 17/10, 2016 at 6:13 Comment(2)
i just post these value { "trips": [ { "departure_code": "SYD", "arrival_code": "LON", "outbound_date": "2014-01-24", "inbound_date": "2014-01-29" } ], "adults_count": 1, "locale": "ar" }Irenairene
@Irenairene Kaur has asked for volley body post parameters and not Okhttp, where both are completely different libraries in their formatFranglais

© 2022 - 2024 — McMap. All rights reserved.