वॉली - पोस्ट / जीईटी पैरामीटर


81

मैंने वॉली के बारे में Google IO 2013 सत्र देखा और मैं वॉली पर स्विच करने पर विचार कर रहा हूं। क्या वोले अनुरोध करने के लिए POST / GET मापदंडों को जोड़ने का समर्थन करता है? यदि हाँ, तो मैं यह कैसे कर सकता हूँ?


2
मैंने पूरे कीनोट को नहीं देखा था, लेकिन मुझे पूरा यकीन है कि जीईटी को सिर्फ URL (जैसे। http://example.com?param1=val1&param2=val2) के लिए मापदंडों को जोड़कर
उल्लेखनीय

ऐसा लगता है कि अभी तक कोई दस्तावेज नहीं है, लेकिन आप यहां स्रोत की जांच कर सकते हैं android.googlesource.com/platform/frameworks/volley/+/master
MM।

@ JJ56 - सही है, लेकिन POST मापदंडों के बारे में क्या? मैंने सोर्स कोड देखा, लेकिन POST मापदंडों से संबंधित कुछ भी नहीं मिला।
ज़ीम

1
यह कहते हुए मुझे शर्म आती है। लेकिन, यदि आप यह पूछते हैं कि आपके अनुरोध का आपके सर्वर पर एक निकाय क्यों नहीं है, तो सुनिश्चित करें कि आप POST / PUT विधि का उपयोग कर रहे हैं। लगता है मैं बस थक गया हूँ। आशा है कि यह टिप्पणी किसी को मदद करती है या मुझे बेहतर महसूस करने में मदद करती है
अल्विन केसलर

जवाबों:


64

आपके अनुरोध वर्ग (जो अनुरोध का विस्तार करता है) में, getParams () विधि को ओवरराइड करें। आप हेडर के लिए भी ऐसा ही करेंगे, बस गेटहेडर्स () को ओवरराइड करें।

यदि आप PostWithBody में TestRequest.java में वॉली परीक्षणों को देखते हैं, तो आपको एक उदाहरण मिलेगा। यह कुछ इस तरह चलता है

public class LoginRequest extends Request<String> {

    // ... other methods go here

    private Map<String, String> mParams;

    public LoginRequest(String param1, String param2, Listener<String> listener, ErrorListener errorListener) {
        super(Method.POST, "http://test.url", errorListener);
        mListener = listener;
        mParams = new HashMap<String, String>();
        mParams.put("paramOne", param1);
        mParams.put("paramTwo", param2);

    }

    @Override
    public Map<String, String> getParams() {
        return mParams;
    }
}

इवान चार्लटन एक त्वरित उदाहरण परियोजना बनाने के लिए पर्याप्त था जो हमें बताए कि वॉली का उपयोग कैसे करें। https://github.com/evancharlton/folly/


71
ध्यान दें कि getParamsकेवल POST या PUT अनुरोध में (डिफ़ॉल्ट रूप से) कहा जाता है, लेकिन GET अनुरोध में नहीं । Ogre_BGR का उत्तर देखें
इताई हंसकी

2
विश्वास नहीं कर सकता कि मैंने अब तक कभी नहीं देखा
अफजल एन

@AfzalivE, उपरोक्त कोड का उपयोग करते समय OAuth के साथ एपीआई अनुरोध पर हस्ताक्षर करने के बारे में कोई विचार?
बिपिन वायलु

2
@BipinVayalu यदि आप Google API से कनेक्ट कर रहे हैं, तो आपको com.android.volley.AndroidAuthenticator
पियरे-एंटोनी

आप mParams को तुरंत भूल गए।
मोरिट्ज़

86

GET मापदंडों के लिए दो विकल्प हैं:

पहला : जैसा कि आप केवल स्ट्रिंग का उपयोग कर सकते हैं और उनके मान के साथ पैरामीटर प्लेसहोल्डर्स को प्रतिस्थापित कर सकते हैं प्रश्न के एक टिप्पणी में सुझाव दिया गया है:

String uri = String.format("http://somesite.com/some_endpoint.php?param1=%1$s&param2=%2$s",
                           num1,
                           num2);

StringRequest myReq = new StringRequest(Method.GET,
                                        uri,
                                        createMyReqSuccessListener(),
                                        createMyReqErrorListener());
queue.add(myReq);

जहाँ num1 और num2 स्ट्रिंग वैरिएबल होते हैं जिनमें आपके मान होते हैं।

दूसरा : यदि आप नए बाहरी HttpClient (उदाहरण के लिए 4.2.x) का उपयोग कर रहे हैं, तो आप अपने Uri के निर्माण के लिए URIBuilder का उपयोग कर सकते हैं। लाभ यह है कि यदि आपके यूआरआई स्ट्रिंग में पहले से ही पैरामीटर हैं, तो इसे पास करना आसान होगा URIBuilderऔर फिर ub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8"));अपने अतिरिक्त मापदंडों को जोड़ने के लिए उपयोग करें। इस तरह आप "अगर?" यूआरआई में पहले से ही जोड़ा जाता है या कुछ और याद करने के लिए और इस तरह संभावित त्रुटियों के लिए एक स्रोत को समाप्त करने के लिए जोड़ा जाता है।

POST मापदंडों के लिए शायद कभी-कभी ऐसा करने के लिए स्वीकृत उत्तर की तुलना में आसान होगा:

StringRequest myReq = new StringRequest(Method.POST,
                                        "http://somesite.com/some_endpoint.php",
                                        createMyReqSuccessListener(),
                                        createMyReqErrorListener()) {

    protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
        Map<String, String> params = new HashMap<String, String>();
        params.put("param1", num1);
        params.put("param2", num2);
        return params;
    };
};
queue.add(myReq);

उदाहरण के लिए सिर्फ getParams()विधि को ओवरराइड करना ।

आप एक कार्यकारी उदाहरण (कई अन्य बुनियादी वॉली उदाहरणों के साथ) एंडोरिड वॉली उदाहरण परियोजना में पा सकते हैं


मैंने वॉली के आपके उदाहरणों का अनुसरण किया है। अब तक यह सबसे ज्यादा मददगार वोली कोड है, लेकिन मुझे JsonObjectRequest में एक समस्या है। जब तक मैं इसे फिर से स्थापित नहीं करता तब तक मुझे createMyReqSuccessListener में पुरानी प्रतिक्रिया मिली। क्या वॉली स्टोर डेटा कैश में है? कृपया इसे करने का एक तरीका सुझाएं।
स्काईवॉकर

2
केवल छवियां कैश की गई हैं। कृपया जांचें कि क्या कुछ प्रॉक्सी आपके अनुरोधों को रोक रहा है। यदि अनुरोधों में बिल्कुल समान URL है और यह संभव है कि प्रॉक्सी केवल पहला परिणाम दे रहा है।
ओग्यान

2
फ़ायरफ़ॉक्स के लिए एक प्लगइन है जिसे "HTTP संसाधन परीक्षण" कहा जाता है जो आपको फिर से वेब सर्वर को अनुरोध भेजने की अनुमति देता है। यह इस तरह के मामलों के परीक्षण के लिए काफी उपयोगी है। बस अपना URL दर्ज करें (और यदि कोई हो तो POST पैरामीटर) और देखें कि लगातार कई अनुरोधों के लिए सर्वर की प्रतिक्रिया क्या है। यदि आपको फिर से वही प्रतिक्रिया मिलती है, तो शायद सबसे अधिक कैश किया जाता है। यदि आप प्रॉक्सी हेडर हैं, तो उस स्थिति में आप लौटे हेडर की जांच कर सकते हैं। "नो-कैश" के बारे में - हां, यह काम करना चाहिए।
ओग्यान

2
मेरा सुझाव है कि आप अलग-अलग प्रश्न खोलें ताकि अन्य शामिल हो सकें और मदद कर सकें। कृपया यह जानकारी प्रदान करें कि आप HURL या HttpClient का उपयोग कर रहे हैं, यह भी बताएं कि आप जिस Android संस्करण के खिलाफ परीक्षण कर रहे हैं। कृपया, नए प्रश्न का लिंक यहां दें ताकि लोग चर्चा का अनुसरण कर सकें।
ओग्यान

3
@ युसूफ संभवत: यदि आप इसे नए प्रश्न के रूप में पूछते हैं, तो आपको बहुत बेहतर उत्तर मिलेंगे, लेकिन संक्षेप में: POST अनुरोध आपको फ़ाइलें और अन्य बड़े डेटा भेजने की अनुमति देता है जो GET अनुरोध में फिट नहीं होंगे। GET अनुरोध का उपयोग करते समय सुरक्षा जोखिम भी होता है क्योंकि URL इस प्रकार संवेदनशील डेटा को उजागर करने वाले सर्वर पर लॉग इन हो सकता है
ओग्यान

23

CustomRequest वॉली के JSONObjectRequest को हल करने का एक तरीका है StringRequest

यहाँ सहायक वर्ग है जो परम को जोड़ने की अनुमति देता है:

    import java.io.UnsupportedEncodingException;
    import java.util.Map;    
    import org.json.JSONException;
    import org.json.JSONObject;    
    import com.android.volley.NetworkResponse;
    import com.android.volley.ParseError;
    import com.android.volley.Request;
    import com.android.volley.Response;
    import com.android.volley.Response.ErrorListener;
    import com.android.volley.Response.Listener;
    import com.android.volley.toolbox.HttpHeaderParser;

    public class CustomRequest extends Request<JSONObject> {

    private Listener<JSONObject> listener;
    private Map<String, String> params;

    public CustomRequest(String url, Map<String, String> params,
            Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }

    public CustomRequest(int method, String url, Map<String, String> params,
            Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(method, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }

    protected Map<String, String> getParams()
            throws com.android.volley.AuthFailureError {
        return params;
    };

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

    @Override
    protected void deliverResponse(JSONObject response) {
        // TODO Auto-generated method stub
        listener.onResponse(response);
    }

}

ग्रीनचिउ को धन्यवाद


@WarrenFaith इशारा करने के लिए धन्यवाद, मैंने जवाब अपडेट कर दिया है!
LOG_TAG

3
बहुत बहुत धन्यवाद, मैं इस समाधान को प्राप्त करने से पहले घंटों खोज रहा था, यह बहुत अजीब है कि JSONObjectReuqest getParams()फ़ंक्शन ओवरराइडिंग काम नहीं कर रहा है।
वालिद अम्मार

FYI करें यह पढ़ @MohammadWalid stackoverflow.com/questions/16902716/... और उपयोग पुराना वापस करने के लिए प्रयास करें! वॉली और रिट्रोफिट दोनों का उपयोग ओखटप के साथ किया जा सकता है!
LOG_TAG

मैंने इस समाधान की कोशिश की, लेकिन मेरे लिए काम नहीं किया। getParams () नहीं कहा जाता है।
महदी

10

यह सहायक वर्ग GET और POST अनुरोधों के लिए मापदंडों का प्रबंधन करता है:

import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;    

import org.json.JSONException;
import org.json.JSONObject;

import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;

public class CustomRequest extends Request<JSONObject> {
    private int mMethod;
    private String mUrl;
    private Map<String, String> mParams;
    private Listener<JSONObject> mListener;

    public CustomRequest(int method, String url, Map<String, String> params,
            Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(method, url, errorListener);
        this.mMethod = method;
        this.mUrl = url;
        this.mParams = params;
        this.mListener = reponseListener;
    }

@Override
public String getUrl() {
    if(mMethod == Request.Method.GET) {
        if(mParams != null) {
            StringBuilder stringBuilder = new StringBuilder(mUrl);
            Iterator<Map.Entry<String, String>> iterator = mParams.entrySet().iterator();
            int i = 1;
            while (iterator.hasNext()) {
                Map.Entry<String, String> entry = iterator.next();
                if (i == 1) {
                    stringBuilder.append("?" + entry.getKey() + "=" + entry.getValue());
                } else {
                    stringBuilder.append("&" + entry.getKey() + "=" + entry.getValue());
                }
                iterator.remove(); // avoids a ConcurrentModificationException
                i++;
            }
            mUrl = stringBuilder.toString();
        }
    }
    return mUrl;
}

    @Override
    protected Map<String, String> getParams()
            throws com.android.volley.AuthFailureError {
        return mParams;
    };

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

    @Override
    protected void deliverResponse(JSONObject response) {
        // TODO Auto-generated method stub
        mListener.onResponse(response);
    }
}

यह जीईटी विधि में मापदंडों को जोड़ने का धन्यवाद करता है, धन्यवाद!
१६:१६

2
हमारे मामले में इट्रिटर दृष्टिकोण ने मूल मैप परमेस ऑब्जेक्ट को नष्ट कर दिया, जिसे हमने फ़ंक्शन में पास किया था। वॉली आंतरिक रूप से GetUrlकई बार कॉल करता है। हम एक अलग उत्तर में पोस्ट किए गए एक क्लासिक फ़ॉरेस्ट दृष्टिकोण के साथ समाप्त हुए। आशा है कि यह यहाँ कौन भूमि में मदद करता है। :)
पाओलो कैसिएलो

3 मापदंडों के साथ अनुरोध करने के लिए इस सहायक वर्ग को कैसे कॉल करें
kgandroid

@kgandroid, अपनी चाबियाँ और मूल्यों के साथ एक नक्शा <स्ट्रिंग, स्ट्रिंग> बनाएं। उदाहरण: नक्शा <स्ट्रिंग, स्ट्रिंग> params = नया HashMap <स्ट्रिंग, स्ट्रिंग> (); params.put ("param1", "value1"); params.put ("param2", "value2"); params.put ("param3", "value3");
एंड्रिया मोटो

6

जीईटी के मापदंडों से निपटना मैंने एंड्रिया मोतो के समाधान पर आधारित किया। समस्या यह थी कि वॉली ने GetUrlकई बार फोन किया और उनके समाधान ने एक Iterator का उपयोग करते हुए, मूल मैप ऑब्जेक्ट को नष्ट कर दिया। बाद की वॉली आंतरिक कॉलों में एक खाली परमेस ऑब्जेक्ट था।

मैंने मापदंडों के एनकोड को भी जोड़ा।

यह एक इनलाइन उपयोग (कोई उपवर्ग) नहीं है।

public void GET(String url, Map<String, String> params, Response.Listener<String> response_listener, Response.ErrorListener error_listener, String API_KEY, String stringRequestTag) {
    final Map<String, String> mParams = params;
    final String mAPI_KEY = API_KEY;
    final String mUrl = url;

    StringRequest stringRequest = new StringRequest(
            Request.Method.GET,
            mUrl,
            response_listener,
            error_listener
    ) {
        @Override
        protected Map<String, String> getParams() {
            return mParams;
        }

        @Override
        public String getUrl() {
            StringBuilder stringBuilder = new StringBuilder(mUrl);
            int i = 1;
            for (Map.Entry<String,String> entry: mParams.entrySet()) {
                String key;
                String value;
                try {
                    key = URLEncoder.encode(entry.getKey(), "UTF-8");
                    value = URLEncoder.encode(entry.getValue(), "UTF-8");
                    if(i == 1) {
                        stringBuilder.append("?" + key + "=" + value);
                    } else {
                        stringBuilder.append("&" + key + "=" + value);
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                i++;

            }
            String url = stringBuilder.toString();

            return url;
        }

        @Override
        public Map<String, String> getHeaders() {
            Map<String, String> headers = new HashMap<>();
            if (!(mAPI_KEY.equals(""))) {
                headers.put("X-API-KEY", mAPI_KEY);
            }
            return headers;
        }
    };

    if (stringRequestTag != null) {
        stringRequest.setTag(stringRequestTag);
    }

    mRequestQueue.add(stringRequest);
}

यह फ़ंक्शन APIKEY को पारित करने के लिए हेडर का उपयोग करता है और इसके पूरा होने से पहले इसे रद्द करने के लिए उपयोगी TAG सेट करता है।

उम्मीद है की यह मदद करेगा।


3

यह आपकी मदद कर सकता है ...

private void loggedInToMainPage(final String emailName, final String passwordName) {

    String tag_string_req = "req_login";
    StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://localhost/index", new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d(TAG, "Login Response: " + response.toString());
            try {
                JSONObject jsonObject = new JSONObject(response);
                Boolean error = jsonObject.getBoolean("error");
                if (!error) {

                    String uid = jsonObject.getString("uid");
                    JSONObject user = jsonObject.getJSONObject("user");
                    String email = user.getString("email");
                    String password = user.getString("password");


                    session.setLogin(true);
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    startActivity(intent);
                    finish();
                    Toast.makeText(getApplicationContext(), "its ok", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            System.out.println("volley Error .................");
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("tag", "login");
            params.put("email", emailName);
            params.put("password", passwordName);
            return params;
        }
    };


    MyApplication.getInstance().addToRequestQueue(stringRequest,tag_string_req);
}

3

भविष्य के पाठकों के लिए

मुझे वॉली के साथ काम करना बहुत पसंद है । विकास के समय को बचाने के लिए मैंने अपनी परियोजना के साथ वॉली को सेटअप करने के लिए छोटे काम के पुस्तकालय Gloxey Netwok प्रबंधक को लिखने की कोशिश की । इसमें JSON पार्सर और विभिन्न अन्य विधियां शामिल हैं जो नेटवर्क उपलब्धता की जांच करने में मदद करती हैं।

उपयोग ConnectionManager.classके लिए विभिन्न तरीकों, जिसमें वॉली स्ट्रिंग और वॉली JSON का अनुरोध उपलब्ध हैं। आप हेडर के साथ या उसके बिना GET, PUT, POST, DELETE के अनुरोध कर सकते हैं । आप यहाँ पूर्ण प्रलेखन पढ़ सकते हैं ।

बस इस लाइन को अपनी gradle फ़ाइल में रखें।

  dependencies { 

       compile 'io.gloxey.gnm:network-manager:1.0.1'
   }

वॉली StringRequest

विधि GET (हेडर के बिना)

    ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, volleyResponseInterface);

कैसे इस्तेमाल करे?

     Configuration                Description

     Context                      Context 
     isDialog                     If true dialog will appear, otherwise not.
     progressView                 For custom progress view supply your progress view id and make isDialog true. otherwise pass null. 
     requestURL                   Pass your API URL.  
     volleyResponseInterface      Callback for response.  

उदाहरण

    ConnectionManager.volleyStringRequest(this, false, null, "url", new VolleyResponse() {
    @Override
    public void onResponse(String _response) {

        /**
         * Handle Response
         */
    }

    @Override
     public void onErrorResponse(VolleyError error) {

        /**
         * handle Volley Error
         */
    }

    @Override
    public void isNetwork(boolean connected) {

        /**
         * True if internet is connected otherwise false
         */
    }
});

वॉली StringRequest

विधि POST / PUT / DELETE (हेडर के बिना)

    ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, requestMethod, params, volleyResponseInterface);

उदाहरण

Use Method : Request.Method.POST
             Request.Method.PUT
             Request.Method.DELETE

Your params : 

HashMap<String, String> params = new HashMap<>();
params.put("param 1", "value");
params.put("param 2", "value");

ConnectionManager.volleyStringRequest(this, true, null, "url", Request.Method.POST, params, new VolleyResponse() {
    @Override
    public void onResponse(String _response) {

        /**
         * Handle Response
         */
    }

    @Override
    public void onErrorResponse(VolleyError error) {

        /**
         * handle Volley Error
         */
    }

    @Override
    public void isNetwork(boolean connected) {

        /**
         * True if internet is connected otherwise false
         */
    }
});

बक्शीश

Gloxey JSON पार्सर

अपने एपीआई प्रतिक्रिया को पार्स करने के लिए ग्लॉक्सी जोंस पार्सर का उपयोग करने के लिए स्वतंत्र महसूस करें।

  YourModel yourModel = GloxeyJsonParser.getInstance().parse(stringResponse, YourModel.class);

उदाहरण

ConnectionManager.volleyStringRequest(this, false, null, "url", new VolleyResponse() {
    @Override
    public void onResponse(String _response) {

        /**
         * Handle Response
         */

         try {

          YourModel yourModel = GloxeyJsonParser.getInstance().parse(_response, YourModel.class);

            } catch (Exception e) {
                e.printStackTrace();
            }

    }

    @Override
     public void onErrorResponse(VolleyError error) {

        /**
         * handle Volley Error
         */
         if (error instanceof TimeoutError || error instanceof NoConnectionError) {

                showSnackBar(parentLayout, getString(R.string.internet_not_found), getString(R.string.retry), new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                     //handle retry button

                    }
                });

            } else if (error instanceof AuthFailureError) {
            } else if (error instanceof ServerError) {
            } else if (error instanceof NetworkError) {
            } else if (error instanceof ParseError) {
            }

    }

    @Override
    public void isNetwork(boolean connected) {

        /**
         * True if internet is connected otherwise false
         */
          if (!connected) {
                showSnackBar(parentLayout, getString(R.string.internet_not_found), getString(R.string.retry), new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //Handle retry button
                    }
                });
    }
});


     public void showSnackBar(View view, String message) {
            Snackbar.make(view, message, Snackbar.LENGTH_LONG).show();
     }

     public void showSnackBar(View view, String message, String actionText, View.OnClickListener onClickListener) {
            Snackbar.make(view, message, Snackbar.LENGTH_LONG).setAction(actionText, onClickListener).show();
     }

लेकिन क्या यह मेथड का समर्थन करता है। गेट
डेविड

हाँ, यह विवरण के लिए एक नज़र है। github.com/adnanbinmustafa/Gloxey-Network-Manager
अदनान बिन मुस्तफा

0

POSTपैरामीटर प्रदान करने के लिए अपने पैरामीटर को कंस्ट्रक्टर के रूप JSONObject में भेजें JsonObjectRequest। तीसरा पैरामीटर JSONObjectअनुरोध बॉडी में उपयोग किए जाने वाले को स्वीकार करता है ।

JSONObject paramJson = new JSONObject();

paramJson.put("key1", "value1");
paramJson.put("key2", "value2");


JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,paramJson,
    new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {

        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
requestQueue.add(jsonObjectRequest);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.