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

简介: 版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/52098755 绪论很久没有写博客了,上次是写了使用Retrofit时怎么设置OKHttp,如果你没看到请看: Retrofit–使用Retrofit时怎样去设置OKHttp 你也可以看看我是怎样使用Retrofit的: Retrofit–合理封装回调能让你的项目高逼格 好了,今天说一下我遇到的一个坑吧。
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/52098755

绪论

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

相关文章
|
存储 算法 安全
操作系统:银行家算法
操作系统:银行家算法
490 0
|
存储 JSON NoSQL
Centos7下安装MongoDB
Centos7下安装MongoDB
624 0
Centos7下安装MongoDB
|
人工智能 机器人 API
小学生泪目Agent开发古诗助手
本文介绍了如何开发一个帮助小学生背古诗的AI Agent。通过阿里云的百炼大模型平台和千问,实现从需求规划、环境准备到开发与测试的全过程。该Agent不仅能根据主题找古诗、提供作者介绍和练习题,还能生成符合诗意境的图片,使学习更有趣。此外,还展示了如何通过无代码方式在百炼平台上构建智能体应用,简化开发流程。希望这能为学习AI Agent开发提供有益参考。
444 19
|
存储 缓存 NoSQL
redis缓存优化
采用获取一次缓存,如果为空的情况,获取分布式锁,让一个线程去重建缓存,另外的线程未获取到锁的情况,休眠短时间,然后再自旋获取缓存。
258 0
|
安全 网络协议 Linux
Linux SSH:安全远程访问与管理
SSH(Secure Shell)是一种网络协议,广泛应用于Linux系统中,用于在不安全的网络中进行安全的远程访问和管理。SSH协议通过加密和身份认证机制,确保数据传输的安全性和用户身份的可靠性。本文将深入探讨Linux下的SSH协议,包括工作原理、配置、密钥认证、安全性措施以及实际应用等,帮助读者充分了解SSH的重要性,并学会在Linux系统中正确使用SSH实现安全远程访问和管理。
977 0
|
存储 数据采集 算法
22年美赛c题-交易策略
22年美赛c题-交易策略
443 0
鸿蒙应用更新跳转到应用市场
鸿蒙应用更新跳转到应用市场
333 0
|
机器学习/深度学习 自然语言处理 搜索推荐
大模型时代了,智能客服就不能智能点?
大模型时代了,智能客服就不能智能点?
281 0
|
网络协议
结合Wireshark捕获分组深入理解TCP/IP协议栈之TCP协议(TCP报文格式+三次握手实例)
摘要:     本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析。   一、概述     TCP是面向连接的可靠传输协议,两个进程互发数据之前需要建立连接,这里的连接只不过是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护任何连接状态信息。
1991 0
|
XML 前端开发 Java
LayUI入门,以及介绍
LayUI入门,以及介绍
675 0

热门文章

最新文章