Retrofit的cookie的保存和添加都可以用Interceptor來實現(xiàn)
下面是接收請求中返回并保存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();
//最近在學(xué)習(xí)RxJava,這里用了RxJava的相關(guān)API大家可以忽略,用自己邏輯實現(xiàn)即可.大家可以用別的方法保存cookie數(shù)據(jù)
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);
//最近在學(xué)習(xí)RxJava,這里用了RxJava的相關(guān)API大家可以忽略,用自己邏輯實現(xiàn)即可
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做如下設(shè)置即可在每次請求中保存和添加cookie:
本人使用的Retrofit2.0可能Retrofit1.9中代碼略有不同,但這個思路應(yīng)該也可以用在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;
}