Как использовать перехватчик для добавления заголовков в Retrofit 2.0
наша команда решила принять Ретрофит 2.0 и я делаю некоторые исследования на нем. Я новичок в этой библиотеке и надеюсь получить некоторую помощь от сообщества:)
как указано в названии, мне интересно, как использовать interceptor для добавления пользовательских заголовков через модернизация 2.0 в нашем приложении для Android. Есть много уроки о interceptor для добавления заголовков в Retrofit 1.X, но так как API сильно изменились в последней версии, Я не уверен, как адаптировать эти методы в новой версии. Кроме того, Retrofit еще не обновил свою новую документацию.
например, в следующих кодах, как я должен реализовать Interceptor класс для добавления дополнительных заголовков? Кроме того, что такое недокументированные Chain объект? Когда будет intercept() назвать?
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
// How to add extra headers?
return response;
}
});
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_API_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
может ли кто-нибудь поделиться какой-то идеей по этому вопросу?
спасибо!!
5 ответов:
зацени.
public class HeaderInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); request = request.newBuilder() .addHeader("appid", "hello") .addHeader("deviceplatform", "android") .removeHeader("User-Agent") .addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0") .build(); Response response = chain.proceed(request); return response; } }
еще одна альтернатива от принято отвечать
public class HeaderInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); request = request.newBuilder() .addHeader("headerKey0", "HeaderVal0") .addHeader("headerKey0", "HeaderVal0--NotReplaced/NorUpdated") //new header added .build(); //alternative Headers moreHeaders = request.headers().newBuilder() .add("headerKey1", "HeaderVal1") .add("headerKey2", "HeaderVal2") .set("headerKey2", "HeaderVal2--UpdatedHere") // existing header UPDATED if available, else added. .add("headerKey3", "HeaderKey3") .add("headerLine4 : headerLine4Val") //line with `:`, spaces doesn't matter. .removeAll("headerKey3") //Oops, remove this. .build(); request = request.newBuilder().headers(moreHeaders).build(); /* ##### List of headers ##### */ // headerKey0: HeaderVal0 // headerKey0: HeaderVal0--NotReplaced/NorUpdated // headerKey1: HeaderVal1 // headerKey2: HeaderVal2--UpdatedHere // headerLine4: headerLine4Val Response response = chain.proceed(request); return response; } }
public class ServiceFactory { public static ApiClient createService(String authToken, String userName, String password) { OkHttpClient defaultHttpClient = new OkHttpClient.Builder() .addInterceptor( chain -> { Request request = chain.request().newBuilder() .headers(getJsonHeader(authToken)) .build(); return chain.proceed(request); }) .authenticator(getBasicAuthenticator(userName, password)) .build(); return getService(defaultHttpClient); } private static Headers getJsonHeader(String authToken) { Headers.Builder builder = new Headers.Builder(); builder.add("Content-Type", "application/json"); builder.add("Accept", "application/json"); if (authToken != null && !authToken.isEmpty()) { builder.add("X-MY-Auth", authToken); } return builder.build(); } private static Authenticator getBasicAuthenticator(final String userName, final String password) { return (route, response) -> { String credential = Credentials.basic(userName, password); return response.request().newBuilder().header("Authorization", credential).build(); }; } private static ApiClient getService(OkHttpClient defaultHttpClient) { return new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(defaultHttpClient) .build() .create(ApiClient.class); } }
проверьте базовую аутентификацию на Android записи, они используют перехватчики, и это довольно ясно.
https://futurestud.io/blog/android-basic-authentication-with-retrofit
вы можете заголовки с помощью перехватчиков с его встроенными методами, как это
interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request original = chain.request(); Request.Builder builder = original.newBuilder(); builder.header("Authorization","Bearer "+ LeafPreference.getInstance(context).getString(LeafPreference.TOKEN)); Request request = builder.method(original.method(), original.body()) .build(); Log.e("request",request.urlString()); Log.e("header",request.header("Authorization")); return chain.proceed(request); } }); }
Comments