目录
目录前言
有时候我们请求服务器需要对Cookie进行存储以此来判断身份,对于浏览器来说它会自己存储Cookie,但是对于手机App应用来说就需要相应的处理才能实现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已经被我们给持久化了
网友评论