authenticator java android annotations retrofit

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