close
当前位置: 物联网在线 > 技术文库 > android >

Retrofit使用OkHttp保存和添加cookie

Retrofit的cookie的保存和添加都可以用Interceptor来实现
下面是接收请求中返回并保存cookie的代码示例:

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()); //这里获取请求返回的cookie if (!originalResponse.headers("Set-Cookie").isEmpty()) { final StringBuffer cookieBuffer = new StringBuffer(); //最近在学习RxJava,这里用了RxJava的相关API大家可以忽略,用自己逻辑实现即可.大家可以用别的方法保存cookie数据 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; }

向请求中添加cookie,代码如下:

public class AddCookiesInterceptor implements Interceptor { private Context context; public AddCookiesInterceptor(Context context) { super(); this.context = context; } @Override public Response intercept(Chain chain) throws IOException { final Request.Builder builder = chain.request().newBuilder(); SharedPreferences sharedPreferences = context.getSharedPreferences("cookie", Context.MODE_PRIVATE); //最近在学习RxJava,这里用了RxJava的相关API大家可以忽略,用自己逻辑实现即可 Observable.just(sharedPreferences.getString("cookie", "")) .subscribe(new Action1<String>() { @Override public void call(String cookie) { //添加cookie builder.addHeader("Cookie", cookie); } }); return chain.proceed(builder.build()); } }

在Retrofit做如下设置即可在每次请求中保存和添加cookie:
本人使用的Retrofit2.0可能Retrofit1.9中代码略有不同,但这个思路应该也可以用在1.9版本中,希望对大家有所帮助

public static OkHttpClient getClient(Context context) { OkHttpClient client = getUnsafeOkHttpClient(); client.interceptors().add(new ReceivedCookiesInterceptor(context)); client.interceptors().add(new AddCookiesInterceptor(context)); return client; }


阅读原文


(责任编辑:ioter)

用户喜欢...

使用Android Studio开发可独立运行(runnable)混淆过的Jar程序

之前开发Java程序一直都是使用Eclipse 开发Jar程序,现在开发基本上都已经弃用Eclipse了,但是有时偶尔开发个小的Jar程序,还要切换回去好麻烦,刚好前几天有人问几个相关的问题,就顺便整...


Android Studio使用小技巧,只能说666

一般的什么快捷键,技巧的文章也有很多。我也看过很多。下面这些事我在来自国外大神发布的:Android Studio Tips of the Day( https://plus.google.com/u/0/collection/wtO0PB )查看到的,而且对于我来说有...


android studio 使用gradle打jar包并混淆

昨天准备把写好的代码使用gradle打jar包出来,并打算加混淆。打jar包容易,结果在混淆上走了弯路。 首先打jar包的配置很简单,使用jar的task,具体代码如下: task buildJar(type: Jar, dependsOn: ['...


详解如何使用代码进行音频合成,以Java为示例语言,以Android为示例平台

音频合成在现实生活中应用广泛,在网上可以搜索到不少相关的讲解和代码实现,但个人感觉在网上搜索到的音频合成相关文章的讲解都并非十分透彻,故而写下本篇博文,计划通过讲解如何...


Android应用性能优化之使用SparseArray

最近在看一些Android应用性能优化的文章时,发现提到了SparseArray替代HashMap可以优化app性能,就对SparseArray做了一番了解,并记录使用心得。 我们来看看SparseArray点击进去包含了那些方法 ////...


Android线程,线程池使用及原理博文参考

这块的知识可以说是一大块,要撸清楚还是要花点时间,线程池中关联到的队列不仅在线程池中使用,在各种第三方网络框架和图片框架等等中也是通过自己调度队列来实现异步。有关理论的东西...


Android RxJava+Retrofit统一处理API返回,根据返回值决定是否Retry,绑定Activity生命周期

假设有个登录API,登录返回的值是 {"code":0,msg:"登录成功","data":{"username":"xxx","nikename":"xxx"...}} {"code":-100,msg:"用户不存在","data":null} {"code":-101,msg:"密码错误","data":null} ... 用其他框架Http请求的时...


Android中使用Rxjava时,内存泄漏了吗?

今天有位同学问了我一个问题,话说,问我 “有遇到网络请求一半,退出Activity造成的Theard泄露吗?已在销毁时调用了un了 我去查看了下rx的源码的unsubscribe方法,定位到一个实现类,NewThre...


使用Kotlin进行Android开发

Kotlin,原意是在俄罗斯的一个小岛,JetBrain在2011年推出了以这个来命名的一个运行在JVM上的语言, 看上去有点类似C#和Scala的结合,并且同为静态类型,作为一门JVM上的语言,可以轻松兼容...


ConstraintLayout约束布局的概念与使用

ConstraintLayout(约束布局) , 是2016年Google I/O最新推出的Android布局, 目前还在完善阶段. 从推出的力度而言, 应该会成为主流布局样式. 在最新版本的Android Studio中, ConstraintLayout已经成为默认布局....