2013-05-29 11 views

risposta

9

Sì, è possibile. Devi eseguire l'override di Request.getHeaders(). Sono pigro e ho usato HttpHeaders e HttpAuthentication da Spring per Android ma puoi semplicemente creare l'intestazione auth e restituirla dal metodo. Da getHeaders() è possibile restituire l'intestazione auth per l'autenticazione di base. Questa è una richiesta di esempio con autenticazione di base.

public class GetUser extends Request<User> { 

    private static final String TAG = GetUser.class.getName(); 

    private Response.Listener<User> mListener; 
    private ObjectMapper mMapper = new ObjectMapper(); 

    public GetUser(Response.ErrorListener errorListener, Response.Listener<User> listener){ 
     super(Method.GET, PoisUtils.BASE_URL + "/users", errorListener); 

     mListener = listener; 
    } 

    @Override 
    protected Response<User> parseNetworkResponse(NetworkResponse response) { 
     String jsonString = new String(response.data); 
     try { 
      User result = mMapper.readValue(jsonString, User.class); 
      return Response.success(result, getCacheEntry()); 
     } catch (IOException e) { 
      Log.d(TAG, e.getMessage()); 
     } 
     return null; 
    } 

    @Override 
    protected void deliverResponse(User response) { 
     mListener.onResponse(response); 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     return AuthUtils.buildAuthHeaders().toSingleValueMap(); 
    } 
} 

Ed ecco come costruisco le intestazioni auth

public static HttpHeaders buildAuthHeaders(){ 

    if(UserUtils.isUserLogged()){ 
     HttpHeaders requestHeaders = new HttpHeaders(); 
     User user = PoisApplication.get().getUser(); 

     HttpAuthentication auth = new HttpBasicAuthentication(
       user.getUsername(), user.getPassword()); 
     requestHeaders.setAuthorization(auth); 

     return requestHeaders; 
    } 
    return null; 
} 
+0

Grazie per la risposta. Tuttavia, sembra una caratteristica molto comune/di base, e penso che una biblioteca come la pallavolo dovrebbe implementarla in qualche modo in un modo più semplice. Sto provando questa libreria, e sembra promettente (davvero entusiasta di una buona libreria HTTP nella cache), ma sto trovando alcune parti che non hanno molto senso: come vorrei la parte parsing (json, xml. ..) essere parte dell'ascoltatore e non della richiesta, in questo modo potrei creare la mia richiesta di base che aggiungerà queste intestazioni tutto il tempo. Forse dovrebbe essere RequestQueue quello con alcune opzioni predefinite (intestazioni) ... Alcune idee. – LocoMike

+0

Non sono sicuro che sia ciò che si vuole fare, ma è possibile creare qualcosa come questo https://gist.github.com/alexmazza/5659606 con il metodo getHeaders() implementato. Sto usando jackson lì, ma potresti usare Gson o qualsiasi altra cosa, e poi usare sempre quella classe come classe base per le tue richieste autenticate – alex

+0

Sì, ma se voglio ottenere alcuni dati JSON e più tardi alcuni dati xml, io dovrebbe replicare la logica, o creare una classe base, che abbia il codice delle intestazioni, e quindi dovrei creare 2 sottoclassi, e non sarei in grado di usare la JsonRequest predefinita, ecc ... Per me, sembra una risposta e le richieste dovrebbero essere in classi diverse (l'analisi dovrebbe appartenere al listener) in modo da poterle mescolare. Problemi di ereditarietà! ;) Grazie comunque per la risposta. – LocoMike

71

Per coloro che non vogliono usare molla per Android solo per questo, ecco come fare.

@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    HashMap<String, String> params = new HashMap<String, String>(); 
    String creds = String.format("%s:%s","USERNAME","PASSWORD"); 
    String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT); 
    params.put("Authorization", auth); 
    return params; 
} 

Si noti che potrebbe essere necessario utilizzare Base64.NO_WRAP invece di Base64.DEFAULT per questo al lavoro. Come indicato nei commenti.

API 8+

+1

Questo è veramente buono in quanto la dimensione finale dell'APK è molto importante per i piccoli progetti. – slott

+7

Vale la pena notare che avevo bisogno di usare Base64.NO_WRAP invece di Base64.DEFAULT per far sì che funzionasse correttamente. – Logiraptor

+0

@Logiraptor Il tuo commento mi ha aiutato a correggere 400 errori su dispositivi Andrpiod 2.3. Quale può essere una ragione del problema? – dimetil

0

Per un'autorizzazione proxy (come Squid) utilizzare questa intestazione:

String credentials = proxyUsername + ":" + proxyPassword; 
String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);     
headers.put("Proxy-Authorization", auth);