Przeglądam przykłady i kod, ale nie widzę niczego implementowanego. Czy jest to możliwe na tym etapie?Jak korzystać z podstawowego uwierzytelniania z Volley na Androida?
Odpowiedz
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;
}
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+
To jest naprawdę dobre, ponieważ ostateczny rozmiar pakietu APK jest bardzo ważny dla małych projektów. – slott
Warto zauważyć, że muszę użyć Base64.NO_WRAP zamiast Base64.DEFAULT, aby to działało. – Logiraptor
@Logiraptor Twój komentarz pomógł mi naprawić błąd 400 na urządzeniach Andrpiod 2.3. Co może być przyczyną problemu? – dimetil
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);
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
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
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