Parametrización de Android @Headers

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 una manera de hacerlo parametrizado para que pueda pasar en tiempo de ejecución?

Aquí está el concepto

@Header({Authorization:'OAuth {var}', api_version={var} })

¿Puede 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 toda su solicitud sin cambiar su 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

Since RequestInterceptor ya no está disponible en Retrofit 2.0

Sí, puede pasarlos en tiempo de ejecución. Como cuestión de hecho, casi exactamente como lo escribió. Esto estaría en su clase de interfaz API, llamada say SecretApiInterface.java

 public interface SecretApiInterface { @GET("/secret_things") SecretThing.List getSecretThings(@Header("Authorization") String token) } 

Entonces usted pasa los parámetros a esta interfaz de su petición, algo a lo largo de esas líneas: (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 de método que devuelve un token, depende de usted dónde y cómo lo define.

Por supuesto, puede tener más de una @Header("Blah") String blah anotaciones en la implementación de la interfaz, como en su caso!

Me pareció confuso también, la documentación claramente dice que sustituye a la cabecera, pero no !
De hecho, se agrega como con la @Headers("hardcoded_string_of_liited_use")

Espero que esto ayude 😉

La respuesta aceptada es para una versión anterior de Retrofit. Para futuros espectadores, la manera de hacerlo con Retrofit 2.0 es usar un cliente personalizado OkHttp:

 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. 🙂

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.