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

原创 2016年08月02日 22:43:20

绪论

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

版权声明:本文为博主原创文章,转载请标明出处。

使用git遇到的坑

在github上面已经上传过不少代码了,虽然关注的人很少,我还是低调的做着这件事情。这个也见证了我学习之路。 但是对于使用git命令还是一知半解,这里只是总结我所遇到过的坑…. 1、git上传代码...
  • u011521890
  • u011521890
  • 2016年05月18日 16:17
  • 534

Retrofit--使用Retrofit时怎样去设置OKHttp

绪论:之前我们分析了使用Retrofit怎么用OkHttp持久化管理Cookie,今天打算继续跟大家来分享一些关于怎么去设置OKHttp?如果你还不知道怎么持久化管理Cookie,请看这篇文章: Re...
  • lyhhj
  • lyhhj
  • 2016年05月12日 22:22
  • 9087

Android开发遇到的坑

最近在开发中总会遇到各种坑,由于记忆力不好,先记录在这里。 以前看过的一些总结,基本上很齐全了: http://jcodecraeer.com/plus/view.php?aid=3773 https...
  • ly635676581
  • ly635676581
  • 2016年11月25日 16:31
  • 328

css 自己爬过的一些坑

css 自己爬过的一些坑
  • walliamliu
  • walliamliu
  • 2016年12月25日 13:24
  • 159

前端开发遇到的坑(纯属吐槽)

沟通问题!! 没别的就是沟通问题!!!
  • qq_2842405070
  • qq_2842405070
  • 2017年04月17日 16:44
  • 734

vue中遇到的坑

1 一个是eventHub的坑–重复监听的问题:解决方案监听之前先off掉2 路由的坑–不加replace会两个页面来回跳,无法正常的返回父级页面。3 vuejs对data中数组的原生方法进行了封...
  • coffee3139564344
  • coffee3139564344
  • 2017年07月07日 20:09
  • 918

GLSurfaceView渲染过程详解

GLSurfaceView渲染过程详解 原创 2016年08月24日 18:56:14 标签:GLSurfaceView绘制详解 /GLSurfaceView绘制过程 /GLSur...
  • xiaozhude
  • xiaozhude
  • 2017年12月08日 16:03
  • 50

java中遇到的坑

1.除0 代码:   Java代码   System.out.println(1.0d / 0);   System.out.println(0.0d / 0);   System.ou...
  • u011203602
  • u011203602
  • 2015年12月08日 14:26
  • 1568

Spark踩坑记--数据库

[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值。最近一个实时消费者处理任务,在使用spark str...
  • qq_36290329
  • qq_36290329
  • 2016年10月02日 17:24
  • 324

使用ActiveMQ时遇到的坑

最近项目要做一个消息系统,选来选去,最后锁定到了ActiveMQ上,但是在使用中遇到了一个坑,分享给大家。 在使用PooledConnectionFactory做连接池来优化的时候,我原先按照官方A...
  • u010186896
  • u010186896
  • 2015年06月04日 22:06
  • 3762
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Retrofit--记使用Retrofit时遇到的一个坑
举报原因:
原因补充:

(最多只允许输入30个字)