5

साथ प्रमाणीकरण जानकारी भेजें अपने Android एप्लिकेशन में मैं एक वेब सेवा जो इसवॉली अनुरोध

http://mywesite.com/demo/mob/getmenubycategory/1 

जैसे मैं वॉली उपयोग कर रहा हूँ अनुरोध भेजने के लिए, लेकिन परिणाम VolleyError 401 है लग रहा है कॉल करने के लिए की है। मैंने हेडर जोड़ने के लिए getParams() विधि को ओवरराइड कर दिया है। लेकिन यह काम नहीं कर रहा है। यहां मेरा कोड है।

RequestQueue requestQueue = volleySingleton.getRequestQueue(); 
    requestQueue.add(new JsonObjectRequest(Request.Method.GET, url, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      Log.e(TAG, "onResponse = \n " + response.toString()); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e(TAG, "response error \n" + error.networkResponse.statusCode); 
     } 
    }) { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      try { 
       Map<String, String> map = new HashMap<String, String>(); 
       String key = "Authorization"; 
       String encodedString = Base64.encodeToString(String.format("%s:%s", "USERNAME", "Password").getBytes(), Base64.NO_WRAP); 
       String value = String.format("Basic %s", encodedString); 
       map.put(key, value); 
       return map; 
      } catch (Exception e) { 
       Log.e(TAG, "Authentication Filure"); 
      } 
      return super.getParams(); 
     } 
    }); 

जब मैं अपने ब्राउज़र का उपयोग करता हूं तो यह मेरा उपयोगकर्ता नाम और पासवर्ड दर्ज करने के लिए एक संवाद दिखाता है। मैं वॉली का उपयोग कर अनुरोध के साथ उपयोगकर्ता नाम और पासवर्ड कैसे भेज सकता हूं। इसे हल करने में कोई मदद की सराहना की जाएगी।

+0

क्या आपके पास कोई त्रुटि लॉग है? – Sree

+0

नहीं, यह केवल 'onErrorResponse (VolleyError त्रुटि)' – Sony

+0

में 401 लॉगिंग कर रहा है क्या आप उस 'त्रुटि' को मुद्रित करने का प्रयास करते हैं? – Sree

उत्तर

19

प्रमाणीकरण के लिए नीचे के रूप में, IMHO, आप getParams के बजाय getHeaders ओवरराइड करना चाहिए, कृपया निम्न आज़माएं:

@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> headers = new HashMap<>();     
     String credentials = "username:password"; 
     String auth = "Basic " 
         + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); 
     headers.put("Content-Type", "application/json"); 
     headers.put("Authorization", auth); 
     return headers; 
} 

उम्मीद है कि यह मदद करता है!

+2

धन्यवाद! 'GetParams()' की बजाय 'getHeaders()' का उपयोग करके मेरी समस्या हल हो गई। – Sdghasemi

+0

तो इसका मतलब है कि अपना खुद का अनुरोध एक्सटेंशन बनाना? आप उपयोगकर्ता नाम कैसे पास करते हैं: पासवर्ड डेटा और टोकन कहां जाते हैं? –

+0

@G_V प्रश्न मूल प्रमाणीकरण के बारे में है और जैसा कि आप मेरे नमूना कोड 'स्ट्रिंग क्रेडेंशियल्स = "उपयोगकर्ता नाम: पासवर्ड" में देखते हैं; 'टोकन के बारे में, क्या आपका मतलब वेब सेवा पर भेजे गए टोकन तक पहुंच है? यदि हां, तो यह 'getHeaders(); ' – BNK

0

उपयोग कस्टम वॉली अनुरोध के रूप में मैं नीचे

public class Custom_Volly_Request extends Request<JSONObject> { 
    private Listener<JSONObject> listener; 
    private Map<String, String> params; 

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

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

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

    @Override 
    protected void deliverResponse(JSONObject response) { 
     listener.onResponse(response); 
    } 

    @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)); 
    } 
} 

ऊपर वर्ग उपयोग का उपयोग

Map<String, String> params = new HashMap<>(); 
params.put("key",value);//put your parameters here 
Custom_Volly_Request jsObjRequest = new Custom_Volly_Request(
     Request.Method.POST, url, params, 
     new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       //Log.d("Response: ", response.toString()); 
      } 
     }, 
     new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError response) 
      { 
       Log.d("Response: Error", response.toString()); 
      } 
     } 
); 
संबंधित मुद्दे