问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android retrofit cookie怎么处理

发布网友 发布时间:2022-04-23 14:46

我来回答

1个回答

热心网友 时间:2023-07-07 13:19

首先是抽象的基类
public abstract class BaseApi {
public static final String API_SERVER = "服务器地址"
private static final OkHttpClient mOkHttpClient = new OkHttpClient();
private static Retrofit mRetrofit;

protected static Retrofit getRetrofit() {
if (Retrofit == null) {
Context context = Application.getInstance().getApplicationContext();
//设定30秒超时
mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);
//设置*,以用于自定义Cookies的设置
mOkHttpClient.networkInterceptors()
.add(new CookiesInterceptor(context));
//设置缓存目录
File cacheDirectory = new File(context.getCacheDir()
.getAbsolutePath(), "HttpCache");
Cache cache = new Cache(cacheDirectory, 20 * 1024 * 1024);
mOkHttpClient.setCache(cache);
//构建Retrofit
mRetrofit = new Retrofit.Builder()
//配置服务器路径
.baseUrl(API_SERVER + "/")
//设置日期解析格式,这样可以直接解析Date类型
.setDateFormat("yyyy-MM-dd HH:mm:ss")
//配置转化库,默认是Gson
.addConverterFactory(ResponseConverterFactory.create())
//配置回调库,采用RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//设置OKHttpClient为网络客户端
.client(mOkHttpClient)
.build();
}
return mRetrofit;
}
}1234567891011121314151617181920212223242526272829303132333435

然后是Cookies*
public class CookiesInterceptor implements Interceptor{
private Context context;

public CookiesInterceptor(Context context) {
this.context = context;
}
//重写拦截方法,处理自定义的Cookies信息
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request compressedRequest = request.newBuilder()
.header("cookie", CookieUtil.getCookies(context))
.build();
Response response = chain.proceed(compressedRequest);
CookieUtil.saveCookies(response.headers(), context);
return response;
}
}123456789101112131415161718

CookieUtil则是一些自定*析和生成方法以及SharedPreferences的存取,代码略
然后是Api类
public class UserApi extends BaseApi{
//定义接口
private interface UserService {
//GET注解不可用@FormUrlEncoded,要用@Query注解引入请求参数
@GET("user/user_queryProfile")
Observable<UserProfileResp> queryProfile(@Query("userId") int userId);

//POST方法没有缓存,适用于更新数据
@FormUrlEncoded
@POST("user/user_updateUserName")
Observable<BaseResp> updateUserName(@Field("userName") String userName);
}
protected static final UserService service = getRetrofit().create(UserService.class);

//查询用户信息接口
public static Observable<UserProfileResp> queryProfile(int userId){
return service.queryProfile(userId);
}

//更新用户名接口
public static Observable<BaseResp> updateUserName(String userName){
return service.updateUserName(userName);
}
}123456789101112131415161718192021222324

再就是将Retrofit的响应消息经过Gson解析成期望的数据结构,称之为Model类
上文的BaseResp和UserProfileResp则是自定义的Model
假定服务器约定返回的Json格式为
{
"result":"结果代号,0表示成功",
"msg":"异常信息,仅在失败时返回数据",
"userInfo":
{
"id":"用户id",
"userName":"用户名名字"
}
}123456789

那么UserProfileResp可以写成
public class UserProfileResp {
//@SerializedName是指定Json格式中的Key名
//可以不写,则默认采用与变量名一样的Key名
@SerializedName("userInfo")
private UserProfileModel userInfo;

public UserProfileModel getUserInfo() {
return userInfo;
}
}12345678910

UserProfileModel则是具体的数据结构
public class UserProfileModel {
private int userId;
private String userName;

public String getUserName(){
return userName;
}
}12345678

需要注意的是,如果没有使用@SerializedName指定Key名,当工程被混淆时,变量名会被混淆得与期望的Key名不符。因此需要将这类Model类统一放到一个工程目录,再在proguard-project文件中加入排除项
//不混淆Model类
-keep class com.xxx.model.xxx.** { *; }12

最后是实际调用
public void getProfile(int userId){
UserApi.queryProfile(userId)
.subscribeOn(Schelers.io())
.subscribe(new Subscriber<UserProfileResp>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(UserProfileResp userProfileResp) {
}
});
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 求安卓和IOS手机Web交互上Cookie和Cache的区别 安卓post请求cookie和session的区别和用法 andorid cookie为什么不失效 android 浏览器cookie保存到哪里 浙政钉h5应用安卓9以下版本都获取不到cookie 安卓怎么删除优酷cookie Android开发中怎样使用cookieManager来管理cookie android中怎么清除cookie 安卓手机cookie存放位置 手机怎么开启浏览器的cookie设置,安卓系统的uc 小米平板4,安卓系统,浏览器里有个,接受cookie,选项,是干什么用的? 安卓cookie,cookie是什么?cookie是什么 手机微信身份证绑定的微信支付密码忘了怎么办 只有对方身份证号码怎么修改微信支付密码 微信绑的不是自己的身份证,现在不知道微信支付密码怎么办 微信支付密码不知道,身份认证实名不是我的,怎么改支付密码 微信支付密码忘了身份证也变了改不了怎么办? 家炒栗子怎么炒 微信支付密码我忘记了,我实名认证了但是是用身份证验证的…那怎么改 炒板栗怎么制作 数字大小排列顺序是怎么样的? 在0-9这十个数字中,按大到小的顺序排列,4的前面是几,7的后面是几,6的后面有几? 把1~9这9个数按从大到小的顺序排列,你能添上一些加减使计算的结果也等于100吗? 对数字进行从大到小的排列,需要大于或小于符号吗? java怎么让数组的数字从大到小排序? 在excel中怎么把单元格里面的数字按照大到小的顺序排列 把9个数按从大到小的顺序排列,你能添上一些”+”“—”,使计算的结果等于100。 把0.56、0.065、0.565、0.656、0.6这些数按从大到小的顺序排列是 __ . 数字符号1 与1、以及(一)与一、,它们四个由大到小的顺序是怎么个排列? 把下面各数按从大到小的顺序排列起来。2.8米,80厘米,1.8米,38分米,八米三分米? 中国改革开放以来经济政策的变化 五年级把下列各数由大到小的顺序排列 中国近代史采取哪些经济政策? 有5个数按从大到小的顺序排列,它们的数平均数为84,前三个数的平均数? 我国现行的宏观经济政策有哪些 把下列各数按从大到小的顺序排列.5.45 4.54 5.4545 4.5454&nbsp... 我国的经济政策有哪些? 求吴奇隆与王韵婵合唱的《今生有约》mp3下载 C语言如何输入十个数,按从大到小顺序排列! 建国以来中国推行的经济政策