Retrofit--记使用Retrofit时遇到的一个坑

标签: retrofit cookie
4637人阅读 评论(2) 收藏 举报
分类:

绪论

很久没有写博客了,上次是写了使用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

查看评论

实例带你了解Retrofit 2.0的使用,分享目前开发Retrofit遇到的坑和心得

添加依赖 app/build.gradle 1 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3' ...
  • liangdong131
  • liangdong131
  • 2016-06-30 15:53:09
  • 4531

是时候客观评价Retrofit了,Retrofit这几点你必须明白!

Tamic/CSDN 是时候客观评价下Retrofit了,retrofit客观存在的问题的你必须要知道!在用retrofit开发很久的朋友或多或少采了巨坑,阅读源码和实践后发现并不是我们认为的那么灵活...
  • sk719887916
  • sk719887916
  • 2016-12-13 21:11:13
  • 12111

【Android】Retrofit使用详解--有些相见恨晚

1.Retrofit介绍Retrofit,每次浏览各大网站总会看到它的身影,虽然感觉已经如此熟悉,但是确实又相当陌生,由于一直没有在项目中使用它,今天决定好好整理下,虽然Retrofit1.0的时代已...
  • wangkeke1860
  • wangkeke1860
  • 2016-07-27 17:23:34
  • 4287

Retrofit2.0使用过程中所踩到的坑

Retrofit2.0使用过程中所踩到的坑 转载请注明出处 作者:AboutJoke ( http://blog.csdn.net/u013200308 ) 原文链接:http://blog....
  • u013200308
  • u013200308
  • 2016-09-17 12:53:37
  • 1537

android使用retrofit2混淆后出现解析失败的原因

背景:使用retrofit2套餐访问网络和解析数据,不开混淆的情况下一切正常,开启混淆后访问网络得到数据解析后,得到的是{“b”:0}.  一开始怀疑配置文件有错误,改了好几次都不成功。最后发现是因为...
  • xiangyuan0211
  • xiangyuan0211
  • 2018-02-26 11:41:01
  • 234

retrofit2.0 趟过的坑

retrofit日下最火的联网请求框架,但是对于我这样的小白,还是不很容易上手的,在此记录,一下自认为不方便的的地方。 1.LOG打印,联网的请求在实际项目中肯定是要打印请求数据,响应数据,接口信息...
  • md_beijing
  • md_beijing
  • 2016-08-05 09:57:12
  • 334

Retrofit踩坑之Delete请求

来到一家新的公司,时间直接不够用了,版本出的飞起,很长时间没总结自己最近学到的东西了(其实也没学什么)! 公司的后台是一个搞php的大兄弟,我们进行对接。在对接的过程中,鄙人不才,一般都是用的POS...
  • u014752325
  • u014752325
  • 2017-03-02 18:41:18
  • 11540

Retrofit掉坑记录(一)

随着项目的深入,Retrofit会深入学习,本系列应该当入坑先驱了,不说了,都是累1.@QueryMap AND @FieldMap 错用将会导致HTTP 414错误 首先借用HTTP 414的某百...
  • u013762572
  • u013762572
  • 2016-09-26 22:06:16
  • 4044

升级okhttp3.0+和retrofit2.0+的过程以及遇到的坑

包名变化 okhttp3.0之前是:com.squareup.okhttp.*, 而到3.0之后变成:okhttp3.* retrofit2.0之前:retrofit.* ...
  • TT5267621
  • TT5267621
  • 2016-11-14 11:34:04
  • 5123

Rxjava+Retrofit+OKHttp框架开发时遇到的坑(有遇到就更新)

Rxjava+Retrofit+OKHttp框架开发时遇到的坑(有遇到就更新)
  • nekomimi2333
  • nekomimi2333
  • 2017-03-06 16:19:02
  • 140
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 40万+
    积分: 4104
    排名: 9367
    我的微博
    博客专栏