Retrofit--记使用Retrofit时遇到的一个坑
绪论
很久没有写博客了,上次是写了使用Retrofit时怎么设置OKHttp,如果你没看到请看:
Retrofit–使用Retrofit时怎样去设置OKHttp
你也可以看看我是怎样使用Retrofit的:
Retrofit–合理封装回调能让你的项目高逼格
好了,今天说一下我遇到的一个坑吧。
Retrofit Cookie问题
上次我们说过怎么去实现持久化登录,本地保存用户的cookie:
1.
2.
本地新建PersistentCookieStore文件保存SP中
3.添加依赖
compile 'com.squareup.retrofit2:retrofit:2.0.1' compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okio:okio:1.6.0' compile 'com.google.code.gson:gson:2.6.2' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.squareup.okhttp3:logging-interceptor:3.2.0' compile 'com.squareup.okhttp3:okhttp-urlconnection:3.0.0-RC1'
之前可能没说明添加哪些依赖,导致小伙伴们都问我出现了问题,这次说明一下。
我在做项目的时候遇到的问题就是:
测试环境下:我这样保存cookie是没有问题的,而且几个小伙伴也用了这个方法到项目中也OK,但是当我们的服务器由测试切到了正式环境下之后,cookie是可以获取到的,但是服务器却怎么都不识别,这着实让我很郁闷,我不得不猜想这是后台服务器的问题,但是后台大哥一直坚持他那里面没有问题,没办法,我最后又google了一下,这种方法可以用,先说一下:
同样给HttpClient添加拦截器:
看一下ReceivedCookiesInterceptor和AddCookiesInterceptor这两个文件:
package com.hankkin.bpm.http.cookie; import android.content.Context; import android.content.SharedPreferences; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.Response; import rx.Observable; import rx.functions.Action1; import rx.functions.Func1; 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()); if (!originalResponse.headers("Set-Cookie").isEmpty()) { final StringBuffer cookieBuffer = new StringBuffer(); 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; } }
package com.hankkin.bpm.http.cookie; import android.content.Context; import android.content.SharedPreferences; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import rx.Observable; import rx.functions.Action1; public class AddCookiesInterceptor implements Interceptor { private Context context; private String lang; public AddCookiesInterceptor(Context context,String lang) { super(); this.context = context; this.lang = lang; } @Override public Response intercept(Chain chain) throws IOException { final Request.Builder builder = chain.request().newBuilder(); SharedPreferences sharedPreferences = context.getSharedPreferences("cookie", Context.MODE_PRIVATE); Observable.just(sharedPreferences.getString("cookie", "")) .subscribe(new Action1<String>() { @Override public void call(String cookie) { if (cookie.contains("lang=ch")){ cookie = cookie.replace("lang=ch","lang="+lang); } if (cookie.contains("lang=en")){ cookie = cookie.replace("lang=en","lang="+lang); } //添加cookie builder.addHeader("Cookie", cookie); } }); return chain.proceed(builder.build()); } }
package com.hankkin.bpm.http.cookie; import android.content.Context; import android.content.SharedPreferences; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import rx.Observable; import rx.functions.Action1; public class AddCookiesInterceptor implements Interceptor { private Context context; private String lang; public AddCookiesInterceptor(Context context,String lang) { super(); this.context = context; this.lang = lang; } @Override public Response intercept(Chain chain) throws IOException { final Request.Builder builder = chain.request().newBuilder(); SharedPreferences sharedPreferences = context.getSharedPreferences("cookie", Context.MODE_PRIVATE); Observable.just(sharedPreferences.getString("cookie", "")) .subscribe(new Action1<String>() { @Override public void call(String cookie) { if (cookie.contains("lang=ch")){ cookie = cookie.replace("lang=ch","lang="+lang); } if (cookie.contains("lang=en")){ cookie = cookie.replace("lang=en","lang="+lang); } //添加cookie builder.addHeader("Cookie", cookie); } }); return chain.proceed(builder.build()); } }
大家可以忽略lang的东西,那些是多元化传给服务器的。
我最后的猜测也就是:服务器的正式和测试环境下他在设置cookie值的时候并没有在cookie里面设置完整,所以导致我从cookie里面取的值不正确或者不是最新的,当然这也只是我的猜测,很可能还和环境问题有关系。
总之我们又有了一种持久化管理cookie的方法,记录下来方便以后使用。
参考文章:
Retrofit使用OkHttp保存和添加cookie
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 开发之布局细节对比:Gravity相关
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/52098702 好吧,其实本不必写这篇文章,我打算接下来去写源码方面的。之所以写这个,主要是搜了一下网上已有的博客,都是一堆对属性的描述,我只想说,你们能不能上个图啊。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:text="第一个文本" android:textSize="20sp" android:layout_width="wrap_conten...
- 下一篇
Android开发中的日常积累
欢迎Star,Fork https://github.com/lizhangqu/CoreLink 里面记录了开发过程中有用的东西,欢迎补充,不定时更新。 Android 性能优化 Android内存优化之OOM Android最佳性能实践(1):合理管理内存 Android最佳性能实践(2):分析内存的使用情况 Android最佳性能实践(3):高性能编码优化 Android最佳性能实践(4):布局优化技巧 Android 加固与反编译 Apktool dex2jar DecompileApk Android APK加固技术方案调研 Android Studio专题 idea-live-templates 模板 方法数统计插件,可用于统计是否达到65536个方法 Android-Drawable-Importer插件 GsonFormat Json对应的Bean快速生成插件 android-selector-chapek Selector生成插件 快速生成butterknife注解插件 android-material-design-icon-generator图标插件 Retrol...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 设置Eclipse缩进为4个空格,增强代码规范