0
点赞
收藏
分享

微信扫一扫

Android利用Okhttp3实现Cookie持久化

目录

前言

Retrofit2.0获取响应头信息

这是我服务器端的代码,主要就是添加两个Cookie,lml和itfitness,然后返回的数据是一个固定的json数据:{"code":0,"data":{"luckNum":3},"msg":"成功"}。



请求数据的接口如下:

public interface Api {
@GET("cookietest2")
Observable<Response<ResultBean>> cookieTest();
}

这里我们将返回的对象设置为Response,因为可以通过Response对象获取到响应头信息,其中Response的泛型则是我们那段固定的json数据用GsonFormat转换的对象,而Cookie信息的获取就是在请求结束的时候。

RetrofitUtils.getInstance(this).getApiServier(Api.class)
.cookieTest()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response<ResultBean>>() {
@Override
public void accept(Response<ResultBean> responseBodyResponse) throws Exception {
Headers headers = responseBodyResponse.headers();//我们通过Response的headers对象获取到响应头信息。
List<String> values = headers.values("Set-Cookie");//通过“Set-Cookie”字段获取到服务器返回的Cookie信息
for(String s:values){
Log.e("测试-请求头",s);
}
Log.e("测试-请求体", responseBodyResponse.body().getMsg());//这里responseBodyResponse.body()获取的就是ResultBean对象
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e("错误",throwable.getMessage());
}
});

我们请求后Logcat打印的结果如下:



可以看到我们已经成功的获取了Cookie信息了,接下来就需要我们将Cookie信息保存下来,在以后的请求添加请求头信息了,然后在响应信息里更新Cookie信息,但是光是听就觉得这种方法麻烦了,不过还好Okhttp3给我们封装好了,接下来我们就看看Okhttp3如何实现Cookie持久化。

Okhttp3Cookie持久化

Okhttp3实现Cookie持久化很简单,首先我们需要在app gradle中引入如下依赖库:

implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'

然后在Project的build文件下加入如下代码:

buildscript {

repositories {
google()
jcenter()
maven { url "https://jitpack.io" }//这个需要加入
}
...
}

allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }//这个需要加入
}
}

最后我们需要对OkHttpClient进行配置:

OkHttpClient.Builder builder = new OkHttpClient.Builder();
PersistentCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context.getApplicationContext()));
builder.cookieJar(cookieJar);//这是关键
OkHttpClient client = builder.build();

Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();

这样就将Cookie进行持久化了,而我们查看存储的Cookie的方法则是:

SharedPrefsCookiePersistor sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(MainActivity.this);
List<Cookie> cookies = sharedPrefsCookiePersistor.loadAll();

Activity代码:

public class MainActivity extends AppCompatActivity {
private Button requestBt, logBt;
private SharedPrefsCookiePersistor sharedPrefsCookiePersistor;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(this);
setContentView(R.layout.activity_main);
requestBt = (Button) findViewById(R.id.bt);
logBt = (Button) findViewById(R.id.bt3);
requestBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.this.onClick(v);
}
});
logBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(MainActivity.this);
List<Cookie> cookies = sharedPrefsCookiePersistor.loadAll();
for (Cookie cookie:cookies){
Log.e("所有的Cookie:",cookie.name()+":"+cookie.value());
}
}
});
}
public void onClick(View view){
RetrofitUtils.getInstance(this).getApiServier(Api.class)
.cookieTest()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResultBean>() {
@Override
public void accept(ResultBean resultBean) throws Exception {

}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e("错误",throwable.getMessage());
}
});

}
}

界面上放了两个按钮一个是请求的一个是打印Cookie的:



另外我们在服务器代码中加入了打印Request请求头中的Cookie信息:



当我们点击发送请求然后点击打印Cookie按钮的时候Logcat信息如下:


当我们再次点击发送请求的时候服务器的信息如下:



这说明Cookie已经被我们给持久化了
举报

相关推荐

0 条评论