5

Nella mia app Android devo chiamare un servizio web che assomiglia a questoinviare le informazioni di autenticazione con richiesta volley

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

Sto usando il volley per inviare la richiesta, ma il risultato è VolleyError 401. Ho sostituito il metodo getParams() per aggiungere l'intestazione. ma non sta funzionando. Ecco il mio codice.

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

Quando utilizzo il browser mostra una finestra di dialogo per inserire nome utente e password. Come posso inviare username e password con la richiesta usando volley. Qualsiasi aiuto per risolvere questo sarà apprezzato.

richiesta
+0

Avete qualche registro errori? – Sree

+0

no, si tratta semplicemente di registrare 401 in "onErrorResponse (Errore VolleyError)" – Sony

+0

si prova a stampare quell'errore? – Sree

risposta

19

Per l'autenticazione, secondo me, si dovrebbe ignorare getHeaders invece di getParams, prova le seguenti:

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

Spero che sia d'aiuto!

+2

Grazie! L'uso di 'getHeaders()' invece di 'getParams()' ha risolto il mio problema. – Sdghasemi

+0

Quindi questo significa creare la propria estensione di richiesta? Come si passa il nome utente: dati della password e dove vanno i token? –

+0

@G_V la domanda riguarda l'autenticazione di base e come vedi nel mio codice di esempio 'String credentials =" username: password ";', a proposito dei token, intendi il token di accesso inviato al servizio web? Se sì, è anche in 'getHeaders();' – BNK

0

Use Custom Volley come io uso di seguito

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

Utilizzare la classe di cui sopra come sotto

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