Андроида Модифицированной Параметризованные @Заголовков
Я использую 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
)
4 ответа:
Помимо использования параметра @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
Да, вы можете сдать их во время выполнения. На самом деле, почти так же, как вы его напечатали. Это было бы в вашем классе 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
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();
надеюсь, что это поможет кому-то. :)
Ретрофит 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.