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()); } }
Où 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.