写在前面:只是记录一下自己做的过程,概念之类的不是那么清晰。这个的背景是一开始总是手动用@Header添加Cookie头在请求表单前面,结果返回的内容不对,问了师兄说还是用指定client来做比较好。换了这种方法,果然能成功返回了。而且这个样子一劳永逸,不用每次都手动加Cookie。
https://blog.csdn.net/weixin_43495735/article/details/89459452
写cookiejar的文章一下子找不到了……
需要进行的操作:①考虑到不同的活动都要用到这个Cookie,所以把这个retrofit设为全局变量。
②关于CookieJar的设置。
接下来是相关代码:
使用全局变量需要新建一个类继承Application:
package com.example.mypractice.bean.someextends;
import android.app.Application;
import com.example.mypractice.LocalCookieJar;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MyPracticeApplication extends Application {
private OkHttpClient client;
private Retrofit retrofit;
public Retrofit getRetrofit(){
return this.retrofit;
}
public void setRetrofit(Retrofit retrofit){
this.retrofit=retrofit;
}
public void changeRetrofit(){ //有时候不想用gson解析
this.retrofit=new Retrofit.Builder()
.baseUrl("http://……")
.callFactory(this.client)
.build();
}
@Override
public void onCreate(){
//初始化
client=new OkHttpClient().newBuilder()
.followRedirects(false)
.followSslRedirects(false)
.cookieJar(new LocalCookieJar()) //自动保存和添加cookie
.build();
retrofit=new Retrofit.Builder()
.baseUrl("http://……")
.callFactory(client) //指定client
.addConverterFactory(GsonConverterFactory.create()) //使用gson解析
.build();
super.onCreate();
}
}
得在AndroidManifest.xml里面声明这个,不然会报错:
android:name=".bean.someextends.MyPracticeApplication"//和android:theme那些东西放在一起
涉及到的cookiejar:
package com.example.mypractice;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
public class LocalCookieJar implements CookieJar {
List<Cookie> cookies;
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
if(cookies!=null)
return cookies;
return new ArrayList<Cookie>();
}
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
this.cookies=cookies;
}
}
设置好之后,不管在哪个活动里,只要调用getApplication函数就好啦:
MyPracticeApplication loginRetro=(MyPracticeApplication) getApplication();
Retrofit loginRetrofit=loginRetro.getRetrofit();
之后就是一般的retrofit操作了。
|