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' @Header
annotation, mais y a-t-il un moyen de la paramétrer pour que je puisse passer au moment de l'exécution?
Voici le concept
@Header({Authorization:'OAuth {var}', api_version={var} })
Pouvez-vous les transmettre au Runtime?
@GET("/users")
void getUsers(
@Header("Authorization") String auth,
@Header("X-Api-Version") String version,
Callback<User> callback
)
java
android
annotations
retrofit
jpotts18
la source
la source
Réponses:
En plus d'utiliser le paramètre @Header, je préfère utiliser RequestInterceptor pour mettre à jour toutes vos demandes sans changer votre interface. En utilisant 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 devez utiliser à la
Interceptor
place deRequestInterceptor
Depuis
RequestInterceptor
n'est plus disponible dans Retrofit 2.0la source
RestAdapter
dépend de Retrofit1, c'est le cas dans Retrofit2Retrofit
. Je vais utiliser Retrofit2, donc pas de problèmes si vous utilisezRequestInterceptor
le code ci-dessus?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") String token) }
Ensuite, vous passez les paramètres à cette interface à partir de votre requête, quelque chose du genre: (ce fichier serait par exemple 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()); } }
Où se
Somehow.Magically.getToken()
trouve 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 plus d'une
@Header("Blah") String blah
annotations dans l'implémentation de l'interface, comme dans votre cas!Je l'ai trouvé déroutant aussi, la documentation indique clairement qu'il remplace l'en-tête, mais ce n'est PAS le cas !
Il est en fait ajouté comme avec une
@Headers("hardcoded_string_of_liited_use")
annotationJ'espère que cela t'aides ;)
la source
La réponse acceptée concerne une ancienne version de Retrofit. Pour les futurs téléspectateurs, la façon de le faire 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. :)
la source
Interceptor
sur lequel vous pouvez définir ou réinitialiser l'intercepteur ultérieurement. Cependant, je dirais que la mise à niveau en tant que singleton peut être le signe d'une optimisation précoce. Il n'y a pas de frais généraux sur la création d'une nouvelle instance de mise à niveau: github.com/square/retrofit/blob/master/retrofit/src/main/javaInterceptor
s une fois que vous auriez créé une instance Retrofit2.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();
J'utilise ceci pour me connecter à GitHub.
la source