Android 给Retrofit2和OkHttp3添加统一的请求头Header

本文原创作者:一叶飘舟 作者博客地址:http://blog.csdn.net/jdsjlzx

在使用Retrofit时,有时候需要设置Set-Cookie等请求头,如果每一个url都需要,那么直接来个拦截器就好了。

官方说明:

OkHttp3下OkHttpClient的 List< Interceptor> interceptors()方法,返回的是一个不可编辑的列表,如果对其进行编辑会报出UnSupportedOperationException
Interceptor的典型使用场景,就是对request和response的Headers进行编辑

如图:

注意Header头,不要照抄,要灵活运用。

让所有网络请求都附上你的 token:

    Interceptor mTokenInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request originalRequest = chain.request();
            if (Your.sToken == null || alreadyHasAuthorizationHeader(originalRequest)) {
                return chain.proceed(originalRequest);
            }
            Request authorised = originalRequest.newBuilder()
                    .header("Authorization", Your.sToken)
                    .build();
            return chain.proceed(authorised);
        }
    };

为OkHttpClient 添加两个以上的拦截器,如下代码所示:


    public class RestDataSource implements Repository {

        private final MarvelService mMarvelService;

        @Inject
        public RestDataSource() {
            // Log信息
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);

            // 公私密匙
            MarvelSigningInterceptor signingInterceptor = new MarvelSigningInterceptor(
                    BuildConfig.MARVEL_PUBLIC_KEY, BuildConfig.MARVEL_PRIVATE_KEY);

            // OkHttp3.0的使用方式
            OkHttpClient client = new OkHttpClient.Builder()
                    .addInterceptor(signingInterceptor)
                    .addInterceptor(loggingInterceptor)
                    .build();

            // 选择人物信息
            Gson customGsonInstance = new GsonBuilder()
                    .registerTypeAdapter(new TypeToken<List<AvengersCharacter>>() {
                            }.getType(),
                            new MarvelResultsDeserializer<AvengersCharacter>())
                    .create();

            // 适配器
            Retrofit marvelApiAdapter = new Retrofit.Builder()
                    .baseUrl(MarvelService.END_POINT)
                    .addConverterFactory(GsonConverterFactory.create(customGsonInstance))
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(client)
                    .build();

            // 服务
            mMarvelService = marvelApiAdapter.create(MarvelService.class);
        }

        // 返回人物信息
        @Override
        public Observable<List<AvengersCharacter>> getCharacters(int currentOffset) {
            return mMarvelService.getCharacters(currentOffset);
        }
    }

下面来个完整的配置:

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;

public class RetrofitAPIManager {

    public static final String SERVER_URL = "url";

    public static ClientAPI provideClientApi() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(SERVER_URL)
                .client(genericClient())
                .build();
        return retrofit.create(ClientAPI.class);
    }


    public static OkHttpClient genericClient() {
        OkHttpClient httpClient = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request request = chain.request()
                                .newBuilder()
                                .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
                                .addHeader("Accept-Encoding", "gzip, deflate")
                                .addHeader("Connection", "keep-alive")
                                .addHeader("Accept", "*/*")
                                .addHeader("Cookie", "add cookies here")
                                .build();
                        return chain.proceed(request);
                    }

                })
                .build();

        return httpClient;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值