原创

Retrofit使用OkHttp保存和添加cookie

Retrofit的cookie的保存和添加都可以用Interceptor来实现
下面是接收请求中返回并保存cookie的代码示例:

 public class ReceivedCookiesInterceptor implements Interceptor {     private 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()) {             final StringBuffer cookieBuffer = new StringBuffer();             //最近在学习RxJava,这里用了RxJava的相关API大家可以忽略,用自己逻辑实现即可.大家可以用别的方法保存cookie数据             Observable.from(originalResponse.headers("Set-Cookie"))                     .map(new Func1<String, String>() {                         @Override                         public String call(String s) {                             String[] cookieArray = s.split(";");                             return cookieArray[0];                         }                     })                     .subscribe(new Action1<String>() {                         @Override                         public void call(String cookie) {                             cookieBuffer.append(cookie).append(";");                         }                     });             SharedPreferences sharedPreferences = context.getSharedPreferences("cookie", Context.MODE_PRIVATE);             SharedPreferences.Editor editor = sharedPreferences.edit();             editor.putString("cookie", cookieBuffer.toString());             editor.commit();         }          return originalResponse;     }

向请求中添加cookie,代码如下:

 public class AddCookiesInterceptor implements Interceptor {     private Context context;      public AddCookiesInterceptor(Context context) {         super();         this.context = context;      }      @Override     public Response intercept(Chain chain) throws IOException {          final Request.Builder builder = chain.request().newBuilder();         SharedPreferences sharedPreferences = context.getSharedPreferences("cookie", Context.MODE_PRIVATE); //最近在学习RxJava,这里用了RxJava的相关API大家可以忽略,用自己逻辑实现即可                   Observable.just(sharedPreferences.getString("cookie", ""))                 .subscribe(new Action1<String>() {                     @Override                     public void call(String cookie) {                         //添加cookie                         builder.addHeader("Cookie", cookie);                     }                 });         return chain.proceed(builder.build());     } }

在Retrofit做如下设置即可在每次请求中保存和添加cookie:
本人使用的Retrofit2.0可能Retrofit1.9中代码略有不同,但这个思路应该也可以用在1.9版本中,希望对大家有所帮助

    public static OkHttpClient getClient(Context context) {         OkHttpClient client = getUnsafeOkHttpClient();         client.interceptors().add(new ReceivedCookiesInterceptor(context));         client.interceptors().add(new AddCookiesInterceptor(context));          return client;     }


阅读原文

正文到此结束
Loading...