java - authenticator - retrofit token authentication on android
Android Retrofit Parameterized @Header (3)
Estoy usando OAuth y necesito poner el token de OAuth en mi encabezado cada vez que hago una solicitud. Veo la anotación @Header
, pero ¿hay alguna forma de parametrizarla para poder pasarla en tiempo de ejecución?
Aquí está el concepto
@Header({Authorization:''OAuth {var}'', api_version={var} })
¿Puedes pasarlos en Runtime?
@GET("/users")
void getUsers(
@Header("Authorization") String auth,
@Header("X-Api-Version") String version,
Callback<User> callback
)
Además de usar el parámetro @Header, prefiero usar RequestInterceptor para actualizar todas tus solicitudes sin cambiar tu interfaz. Usando algo como:
RestAdapter.Builder builder = new RestAdapter.Builder()
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Accept", "application/json;versions=1");
if (isUserLoggedIn()) {
request.addHeader("Authorization", getToken());
}
}
});
p / s: si está utilizando Retrofit2, debe observar Interceptor
lugar de RequestInterceptor
Dado que RequestInterceptor
ya no está disponible en Retrofit 2.0
La respuesta aceptada es para una versión anterior de Retrofit. Para los futuros espectadores, la forma de hacerlo con Retrofit
2.0 es utilizar un cliente OkHttp personalizado:
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Builder ongoing = chain.request().newBuilder();
ongoing.addHeader("Accept", "application/json;versions=1");
if (isUserLoggedIn()) {
ongoing.addHeader("Authorization", getToken());
}
return chain.proceed(ongoing.build());
}
})
.build();
Retrofit retrofit = new Retrofit.Builder()
// ... extra config
.client(httpClient)
.build();
Espero que ayude a alguien. :)
Sí, puedes pasarlos en tiempo de ejecución. Como cuestión de hecho, casi exactamente como lo escribiste. Esto sería en su clase de interfaz API, nombrada decir SecretApiInterface.java
public interface SecretApiInterface {
@GET("/secret_things")
SecretThing.List getSecretThings(@Header("Authorization") String token)
}
A continuación, transfiere los parámetros a esta interfaz a partir de su solicitud, algo similar a lo que sigue : (este archivo sería, por ejemplo, SecretThingRequest.java )
public class SecretThingRequest extends RetrofitSpiceRequest<SecretThing.List, SecretApiInteface>{
private String token;
public SecretThingRequest(String token) {
super(SecretThing.List.class, SecretApiInterface.class);
this.token = token;
}
@Override
public SecretThing.List loadDataFromNetwork() {
SecretApiInterface service = getService();
return service.getSecretThings(Somehow.Magically.getToken());
}
}
Donde Somehow.Magically.getToken()
es una llamada a método que devuelve un token, depende de usted dónde y cómo lo defina.
Por supuesto, puede tener más de una anotación @Header("Blah") String blah
en la implementación de la interfaz, como en su caso.
También me pareció confuso, la documentación dice claramente que reemplaza el encabezado, ¡pero NO LO HACE !
De hecho, se agrega como con la @Headers("hardcoded_string_of_liited_use")
Espero que esto ayude ;)