2013-05-29 17 views

Odpowiedz

9

Tak, jest to możliwe. Musisz zastąpić Request.getHeaders(). Jestem leniwy i użyłem HttpHeaders i HttpAuthentication od Spring na Androida, ale możesz po prostu zbudować nagłówek auth i zwrócić go z metody. Z getHeaders() możesz zwrócić nagłówek auth dla podstawowego uwierzytelnienia. To jest przykładowe żądanie z podstawowym uwierzytelnieniem.

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

A oto jak zbudować nagłówki 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

dziękuję za odpowiedź. Jednak wygląda to na bardzo powszechną/podstawową cechę i myślę, że biblioteka taka jak volley powinna jakoś to wdrożyć w łatwiejszy sposób. Próbuję tej biblioteki i wygląda obiecująco (bardzo podekscytowany dobrą biblioteką buforowania HTTP), ale znajduję pewne części, które nie mają większego sensu: tak jakbym chciał wykonać część parsującą (json, xml. ..) być częścią Listenera, a nie Żądania, w ten sposób mogę utworzyć własną bazę Zapytanie, które będzie dodawać te nagłówki przez cały czas. Może powinien to być RequestQueue, który ma pewne domyślne opcje (nagłówki) ... Niektóre pomysły. – LocoMike

+0

Nie jestem pewien, czy to jest to, co chcesz zrobić, ale możesz stworzyć coś takiego https://gist.github.com/alexmazza/5659606 z zaimplementowaną metodą getHeaders(). Używam jackson tam, ale możesz użyć Gsona lub cokolwiek innego, a następnie zawsze używać tej klasy jako klasy bazowej dla uwierzytelnionych żądań. – alex

+0

Tak, ale jeśli chcę uzyskać dane JSON, a później niektóre dane xml, musiałby replikować logikę lub utworzyć klasę bazową, która ma kod nagłówków, a następnie musiałbym utworzyć 2 podklasy, a ja nie byłbym w stanie użyć domyślnego JsonRequest, itd. Dla mnie to wygląda jak odpowiedź, a żądania powinny być w różnych klasach (parsowanie powinno należeć do Listenera), abyś mógł je pomieszać. Problemy z dziedziczeniem! ;) W każdym razie dzięki za odpowiedź. – LocoMike

71

Dla tych, którzy nie chcą korzystać z wiosny dla Androida tylko dla tego, oto jak to zrobić.

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

Zauważ, że być może trzeba będzie użyć Base64.NO_WRAP zamiast Base64.DEFAULT to zadziałało. Jak wskazano w komentarzach.

API 8+

+1

To jest naprawdę dobre, ponieważ ostateczny rozmiar pakietu APK jest bardzo ważny dla małych projektów. – slott

+7

Warto zauważyć, że muszę użyć Base64.NO_WRAP zamiast Base64.DEFAULT, aby to działało. – Logiraptor

+0

@Logiraptor Twój komentarz pomógł mi naprawić błąd 400 na urządzeniach Andrpiod 2.3. Co może być przyczyną problemu? – dimetil

0

przypadku pełnomocnictwa (jak kalmary) używać tego nagłówka:

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