Rénovation Android @Headers paramétrés

J’utilise OAuth et je dois mettre le jeton OAuth dans mon en-tête chaque fois que je fais une demande. Je vois l’annotation @Header , mais y a-t-il un moyen de le paramétrer pour que je puisse passer à l’exécution?

Voici le concept

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

Pouvez-vous les transmettre à Runtime?

 @GET("/users") void getUsers( @Header("Authorization") Ssortingng auth, @Header("X-Api-Version") Ssortingng version, Callback callback ) 

Outre l’utilisation du paramètre @Header, je préfère utiliser RequestInterceptor pour mettre à jour toutes vos requêtes sans modifier votre interface. Utiliser quelque chose comme:

 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 vous utilisez Retrofit2, vous devriez remarquer Interceptor au lieu de RequestInterceptor

Puisque RequestInterceptor n’est plus disponible dans Retrofit 2.0

Oui, vous pouvez les transmettre lors de l’exécution. En fait, à peu près exactement comme vous l’avez tapé. Ce serait dans votre classe d’interface API, nommée par exemple SecretApiInterface.java

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

Ensuite, vous transmettez les parameters à cette interface à partir de votre requête, quelque chose dans ce sens: (ce fichier serait par exemple SecretThingRequest.java )

 public class SecretThingRequest extends RetrofitSpiceRequest{ private Ssortingng token; public SecretThingRequest(Ssortingng token) { super(SecretThing.List.class, SecretApiInterface.class); this.token = token; } @Override public SecretThing.List loadDataFromNetwork() { SecretApiInterface service = getService(); return service.getSecretThings(Somehow.Magically.getToken()); } } 

Somehow.Magically.getToken() est un appel de méthode qui renvoie un jeton, c’est à vous de décider où et comment vous le définissez.

Vous pouvez bien sûr avoir plusieurs annotations de type @Header("Blah") Ssortingng blah dans l’implémentation de l’interface, comme dans votre cas!

J’ai trouvé cela aussi déroutant, la documentation dit clairement qu’il remplace l’en-tête, mais ce n’est PAS le cas !
Il est en fait ajouté avec l’ @Headers("hardcoded_ssortingng_of_liited_use")

J’espère que cela t’aides 😉

La réponse acceptée concerne une version antérieure de Retrofit. Pour les futurs téléspectateurs, la façon de procéder avec Retrofit 2.0 consiste à utiliser un client OkHttp personnalisé:

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

J’espère que ça aide quelqu’un. 🙂

Rénovation 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(); 

Je l’utilise pour me connecter à GitHub.