Я использую OAuth, и мне нужно помещать токен OAuth в свой заголовок каждый раз, когда я делаю запрос. Я вижу @Header
аннотацию, но есть ли способ сделать ее параметризованной, чтобы я мог перейти во время выполнения?
Вот концепция
@Header({Authorization:'OAuth {var}', api_version={var} })
Можете ли вы передать их во время выполнения?
@GET("/users")
void getUsers(
@Header("Authorization") String auth,
@Header("X-Api-Version") String version,
Callback<User> callback
)
java
android
annotations
retrofit
jpotts18
источник
источник
Ответы:
Помимо использования параметра @Header, я бы предпочел использовать RequestInterceptor для обновления всего вашего запроса без изменения интерфейса. Используя что-то вроде:
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: Если вы используете Retrofit2, вы должны использовать
Interceptor
вместоRequestInterceptor
Поскольку
RequestInterceptor
больше не доступен в Retrofit 2.0источник
RestAdapter
зависит от Retrofit1, в Retrofit2 так и естьRetrofit
. Я собираюсь использовать Retrofit2, поэтому не будет проблем, если использовать,RequestInterceptor
как указано выше?Да, вы можете передать их во время выполнения. Собственно говоря, почти так же, как вы это напечатали. Это будет в вашем классе интерфейса API с именем, скажем, SecretApiInterface.java.
public interface SecretApiInterface { @GET("/secret_things") SecretThing.List getSecretThings(@Header("Authorization") String token) }
Затем вы передаете параметры этому интерфейсу из своего запроса, что-то вроде этих строк: (этот файл будет, например, 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()); } }
Где
Somehow.Magically.getToken()
находится вызов метода, который возвращает токен, решать вам, где и как его определить.Конечно, вы можете иметь более одной
@Header("Blah") String blah
аннотации в реализации интерфейса, как и в вашем случае!Меня это тоже сбивает с толку, в документации четко сказано, что он заменяет заголовок, но НЕТ !
Фактически добавляется как с
@Headers("hardcoded_string_of_liited_use")
аннотациейНадеюсь это поможет ;)
источник
Принятый ответ относится к более старой версии Retrofit. Для будущих зрителей способ сделать это с помощью
Retrofit
2.0 - использовать собственный клиент 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();
Надеюсь, это кому-то поможет. :)
источник
Interceptor
на которую вы можете установить или сбросить перехватчик на более позднем этапе. Однако я бы сказал, что модернизация как синглтон может быть признаком ранней оптимизации. Нет накладных расходов на создание нового экземпляра модернизации: github.com/square/retrofit/blob/master/retrofit/src/main/java/…Interceptor
s после создания экземпляра Retrofit2.Модернизация 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();
Я использую это для подключения к GitHub.
источник