Retrofit使用拦截器添加Cookie

        最近忙于公司的项目,一直没有更新博客,趁着空余的时间想做一个小项目,也顺便巩固下Android知识点,思来想去借助着鸿洋的玩Android 开放API,从头到尾的开发一遍,看看自己写的和别人的差距有多少。

       做到获取收藏接口的时候,发现请求的数据需要传递Cookie信息,就是指用户在登录成功后,服务端会返回Cookie,里面包含用户的登陆状态信息等,这样用户在访问自己的收藏列表时,加上这个Cookie,那么就可直接获取到文章列表,如果没有Cookie,那服务端就不知道你是要获取哪个用户的文章列表。

       那么接下来就要在登录或者注册成功时,将账号密码做cookie持久化操作即可
       https://www.wanandroid.com/user/login

 方法:POST 
 参数: username,password

      收藏文章列表接口:
        https://www.wanandroid.com/lg/collect/list/0/json 

方法:GET
参数: 页码:拼接在链接中,从0开始。

文章中网络请求封装的Retrofit,底层是通过Okttp实现的,通过Okhttp中的Interceptor拦截器来设置请求头,然后通过retrofit.client(okhttpclient)对请求头进行修改,这样就省去了我们手动添加请求头的步骤。

这里我们创建两个拦截器,一个用于登录时接收Cookie保存在本地,另一个拦截器用于访问时在请求里添加Cookie。

1、首先设置注册或登录后获取到本地拦截的cookie信息
      通过循环将Cookie信息放入到HashSet集合中
      然后通过SharePreference将Cookie信息保存在本地

class ReceivedCookiesInterceptor implements Interceptor {
    Context context;
    public ReceivedCookiesInterceptor(Context context) {
        super();
        this.context = context;
    }
    @Override
    public Response intercept(Chain chain) throws IOException {
        Response originalResponse = chain.proceed(chain.request());
        //这里获取请求返回的cookie
        if (!originalResponse.headers("Set-Cookie").isEmpty()) {
            HashSet<String> cookies = new HashSet<>();
            for(String header: originalResponse.headers("Set-Cookie"))
            {
                cookies.add(header);
            }
            //保存的sharepreference文件名为cookieData
            SharedPreferences sharedPreferences = context.getSharedPreferences("cookieData", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putStringSet("cookie", cookies);
            editor.commit();
        }
        return originalResponse;
    }
}

2、添加本地Cookie进行网络访问的拦截器
      
从Sharepreference中读取Cookie并添加到头部

class AddCookiesInterceptor implements Interceptor {
    Context context;
    public AddCookiesInterceptor(Context context) {
        this.context = context;
    }
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request.Builder builder = chain.request().newBuilder();
        HashSet<String> perferences = (HashSet) context.getSharedPreferences("cookieData", Context.MODE_PRIVATE).getStringSet("cookie", null);
        if (perferences != null) {
            for (String cookie : perferences) {
                builder.addHeader("Cookie", cookie);
            }
        }
        return chain.proceed(builder.build());
    }
}

3、创建OkHttpClient对象,登录时拦截cookie信息
     
设置连接,读写超时时间,设置网络拦截器,调用接收和添加cookie的拦截器

OkHttpUtil(Context context,int connectTimeOut, int writeTimeOut, int readTimeOut) {
       this.context = context;
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .connectTimeout(connectTimeOut, TimeUnit.SECONDS)
                .writeTimeout(writeTimeOut, TimeUnit.SECONDS)
                .readTimeout(readTimeOut, TimeUnit.SECONDS);
        builder.addNetworkInterceptor(new StethoInterceptor());
        client = builder.addInterceptor(new ReceivedCookiesInterceptor(context)).build();
        okHttpClient = builder.addInterceptor(new AddCookiesInterceptor(context)).build();
    }

4、创建Retrofit对象
      设置baseurl,gson转换器等

              retrofit =  new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(okHttpUtil.getClient())
                .client(okHttpUtil.getOkHttpClient())
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

5、创建业务接口类实例对象,create方法内部实际上是用动态代理的方式帮助我们创建了实例对象

anInterface = retrofit.create(RetrofitInterface.class);

6、得到请求的封装对象,包含注解的信息,就是url和参数信息

 Call<HotKeyBean> call = anInterface.myCollect(page);

7、执行异步请求对象

call.enqueue(new Callback<HotKeyBean>() {
            @Override
            public void onResponse(Call<HomeListBean> call, Response<HomeListBean>response) 
               {
                 List<HomeListBean> data = response.body().getData();
              }
            @Override
            public void onFailure(Call<HotKeyBean> call, Throwable t) {
                Toast.makeText(MainActivity.this,t.getMessage(),Toast.LENGTH_LONG).show();
            }
        });

以上就是全部的内容了,欢迎小伙伴留言讨论,希望这篇文章对于需要cookie持久化操作的你有所帮助!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值