Estoy usando OAuth y necesito poner el token de OAuth en mi encabezado cada vez que hago una solicitud. Veo la @Header
anotación, pero ¿hay alguna manera de parametrizarla para que pueda pasar 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
)
java
android
annotations
retrofit
jpotts18
fuente
fuente
Respuestas:
Además de usar el parámetro @Header, prefiero usar RequestInterceptor para actualizar todas sus solicitudes 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á usando Retrofit2, debe usar en
Interceptor
lugar deRequestInterceptor
Dado
RequestInterceptor
que ya no está disponible en Retrofit 2.0fuente
RestAdapter
depende de Retrofit1, en Retrofit2 lo esRetrofit
. Voy a usar Retrofit2, por lo que no hay problemas si se usaRequestInterceptor
como el código anterior.Sí, puede pasarlos en tiempo de ejecución. De hecho, casi exactamente como lo escribió. Esto estaría en su clase de interfaz API, llamada, por ejemplo, SecretApiInterface.java
public interface SecretApiInterface { @GET("/secret_things") SecretThing.List getSecretThings(@Header("Authorization") String token) }
Luego, pasa los parámetros a esta interfaz desde su solicitud, algo así: (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()); } }
Dónde
Somehow.Magically.getToken()
hay una llamada a un método que devuelve un token, depende de usted dónde y cómo lo defina.Por supuesto, puede tener más de una
@Header("Blah") String blah
anotación en la implementación de la interfaz, ¡como en su caso!También lo encontré 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")
anotaciónEspero que esto ayude ;)
fuente
La respuesta aceptada es para una versión anterior de Retrofit. Para los futuros espectadores, la forma de hacer esto con
Retrofit
2.0 es utilizando 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. :)
fuente
Interceptor
al que puede configurar o restablecer el interceptor en una etapa posterior. Sin embargo, yo diría que tener una actualización como singleton puede ser una señal de optimización temprana. No hay gastos generales para crear una nueva instancia de actualizaciónInterceptor
una vez que haya creado una instancia de Retrofit2.Modernización 2.3.0
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder(); okHttpClientBuilder .addInterceptor(new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request.Builder newRequest = request.newBuilder().header("Authorization", accessToken); return chain.proceed(newRequest.build()); } }); Retrofit retrofit = new Retrofit.Builder() .baseUrl(GithubService.BASE_URL) .client(okHttpClientBuilder.build()) .addConverterFactory(GsonConverterFactory.create()) .build();
Estoy usando esto para conectarme a GitHub.
fuente