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
- Detección de presencia de FPU en Android
- ¿Utilizando appMobi puedo crear aplicaciones para Android y aplicaciones para iPhone de forma gratuita (además de los costos de Google / Apple)?
- Lista de lecturas <Item> con retrofit de XML API
- El éxito de Retrofit.Callback () y el fallo () en caso de dos implementaciones de interfaz en la misma Actividad
- Implicaciones de la compatibilidad con varios usuarios de Android (nueva en 4.2) para el modelo de datos del lado del servidor (por ejemplo, android_id)
@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 )
- ¿Cómo cambio entre el GPS y el proveedor de la red?
- Generar errores con XML a la dependencia del convertidor de objetos de java en build.gradle para retroadaptación
- ¿Cómo publicar una solicitud de HTTPS utilizando Retrofit?
- ¿por qué se muestra el mensaje no registrado de la aplicación de Android al iniciar sesión con gmail en la aplicación android?
- Android Fused Location API - cómo utilizar PRIORITY_BALANCED_POWER_ACCURACY y PRIORITY_HIGH_ACCURACY en una aplicación?
- "Servicios del sistema no disponibles para Actividades antes de onCreate ()" ¿Mensaje de error?
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. 🙂