安卓开发之OkHttp持久化Cookie_android okhttp的cookiejar-程序员宅基地

技术标签: 安卓  java  okhttp3  android studio  安卓开发  Android  

前言

OkHttp持久化Cookie使用的是OkHttp3–CookieJar 持久化Cookie
参考文章
https://www.jianshu.com/p/f1df12ceaedc

https://www.jianshu.com/p/1a222a9394ce
okhttp3依赖:

implementation("com.squareup.okhttp3:okhttp:4.9.0")

添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

一、OkHttp持久化Cookie分析

Okhttp3默认是不持久化Cookie的,想要持久化Cookie就要实现CookieJar接口,并且设置他

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cookieJar(new PersistenceCookieJar());

简单实现CookieJar接口

public class PersistenceCookieJar implements CookieJar {
    
            
            List<Cookie> cache = new ArrayList<>();
            
            //Http请求结束,Response中有Cookie时候回调
            @Override
            public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
    
                //内存中缓存Cookie
                cache.addAll(cookies);
            }

            //Http发送请求前回调,Request中设置Cookie
            @Override
            public List<Cookie> loadForRequest(HttpUrl url) {
    
                //过期的Cookie
                List<Cookie> invalidCookies = new ArrayList<>();
                //有效的Cookie
                List<Cookie> validCookies = new ArrayList<>();
                
                for (Cookie cookie : cache) {
    
                    
                    if (cookie.expiresAt() < System.currentTimeMillis()) {
    
                        //判断是否过期
                        invalidCookies.add(cookie);
                    } else if (cookie.matches(url)) {
    
                        //匹配Cookie对应url
                        validCookies.add(cookie);
                    }
                }
                
                //缓存中移除过期的Cookie
                cache.removeAll(invalidCookies);
                
                //返回List<Cookie>让Request进行设置
                return validCookies;
            }
        };
}

二、例子

使用玩安卓平台的开放APIhttps://www.wanandroid.com/index
先发起登录请求保存cookie,之后发起查看自己收藏自己文章的请求并携带cookie
demo

package com.enjoy.networkdemo;

import org.jetbrains.annotations.NotNull;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class CookieUnitTest {
    
    Map<String, List<Cookie>> cookies = new HashMap<>();

    @Test
    public void cookieTest() {
    
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
    
                    //Http请求结束,Response中有Cookie时候回调
                    @Override
                    public void saveFromResponse(@NotNull HttpUrl httpUrl, @NotNull List<Cookie> list) {
    
                        //保存cookie
                        cookies.put(httpUrl.host(), list);
                    }

                    //Http发送请求前回调,Request中设置Cookie
                    @NotNull
                    @Override
                    public List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {
    
                        List<Cookie> cookies = CookieUnitTest.this.cookies.get(httpUrl.host());
                        return cookies == null ? new ArrayList<>() : cookies;
                    }
                })
                .build();
        FormBody formBody = new FormBody.Builder().add("username", "xxx")
                .add("password", "xxx").build();
        Request request = new Request.Builder().url("https://www.wanandroid.com/user/login")
                .post(formBody).build();
        // 准备好请求的Call对象
        Call call = okHttpClient.newCall(request);
        try {
    
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
    
            e.printStackTrace();
        }


        request = new Request.Builder().url("https://www.wanandroid.com/lg/collect/list/0/json")
                .build();
        // 准备好请求的Call对象
        call = okHttpClient.newCall(request);
        try {
    
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
    
            e.printStackTrace();
        }

    }
}

2.1、效果

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/niulinbiao/article/details/120351182

智能推荐

GitHub黑科技,淘宝自动刷喵币!靠这一个脚本就够了-程序员宅基地

文章浏览阅读1.8k次。点击上方“Github爱好者社区”,选择星标回复“资料”,获取小编整理的一份资料开源最前线(ID:OpenSourceTop)猿妹综合整理一年一度的双十一大促又来了,原以为今年总算不需..._github淘宝脚本

C# UI常用操作 - Mars的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/shuyizhi/article/details/6830405-程序员宅基地

文章浏览阅读354次。using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI

openwrt 串口 开发 注意事项_stty speed 9600 cs8 -cstopb -echo raw-程序员宅基地

文章浏览阅读1.3k次。1. 可以安装 sttyopkg update opkg install coreutils-stty2. 设定串口波特率stty -F /dev/ttyS1 raw speed 9600注意,如果在使用串口时,一定要注意 ttyS0 ttyS1 这个S是大写的,再说一下,是大写的在不清楚是,要常用TAB进行补全,这样就不会出错。_stty speed 9600 cs8 -cstopb -echo raw

卷积神经网络如何提取特征的?-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏20次。用文氏图来理解卷积神经网络如何决定提取哪些特征:https://blog.csdn.net/kane7csdn/article/details/84890592为什么卷积能够提取图像的特征?看完此文应该能够给你一个答案:https://blog.csdn.net/charleswangzi/article/details/82733016浅析卷积神经网络为何能够进行特征提取:https://blog.csdn.net/weixin_42078618/article/details/838_卷积神经网络如何提取特征

【NLP】新闻文本分类----基于机器学习的文本分类_新闻文本分类 模型-程序员宅基地

文章浏览阅读1.4k次,点赞3次,收藏22次。【NLP】新闻文本分类----基于机器学习的文本分类机器学习模型文本表示方法one-hotBag of WordsN-gramTF-IDF基于机器学习的文本分类词袋法 + 岭回归分类器`TF-IDF + 岭回归分类器不同参数下的TF-IDF算法TF-IDF参数解读改变不同参数的F1结果改变ngram_range的参数TF-IDF算法与其他分类器模型机器学习模型机器学习是对能通过经验自动改进的计算机算法的研究。机器学习通过历史数据训练出模型对应于人类对经验进行归纳的过程,机器学习利用模型对新数据进行预测对_新闻文本分类 模型

Web API 版本控制的几种方式_web 、app 共用一个后端,版本号如何控制-程序员宅基地

文章浏览阅读3.9w次,点赞10次,收藏28次。http://www.troyhunt.com/2014/02/your-api-versioning-is-wrong-which-is.html这篇文章写得很好,介绍了三种实现web api版本化的三种方式。我从评论里又收集到两种方式,所以一共是5种:方式一:利用URL HTTP GET:https://haveibeenpwned.com/api/v2/breacheda..._web 、app 共用一个后端,版本号如何控制

随便推点

twisted.internet.error.TimeoutError错误的解决方法_twisted.internet.error.tcptimedouterror-程序员宅基地

文章浏览阅读1.6k次。使用scapy 爬取的时候,少数请求链接会出现请求超时,当出现请求超时时,爬虫会自动重试三次。若超过180s且三次后仍没有得到数据,就会放弃请求出现twisted.internet.error.TimeoutError 错误。此时就出现了爬取失败的情况。错误原因:当网络无法满足在180s内下载完所有的请求数量,就会出现此类错误。解决办法:这里做个示例,具体情况具体分析1、降低同时请求的数量CONCURRENT_REQUESTS = 22、 设置合适的超时时间,DOWNLOAD_TIMEOU_twisted.internet.error.tcptimedouterror

[linux]单网卡绑定多个IP_单网卡绑定两个ip-程序员宅基地

文章浏览阅读215次。[linux]单网卡绑定多个IP配置默认网关:默认网关的文件:/etc/sysconfig/network 内容如下:其中test为主机名称NETWORKING=yesHOSTNAME=testGATEWAY=192.168.168.250或:NOZEROCONF=yesGATEWAY=10.230.17.1eth0对应的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0内容如下:DEVICE=eth0BOO.._单网卡绑定两个ip

SwiftUI 5教程之Metal shader 系列资源(WWDC23)_swiftui_metal-程序员宅基地

文章浏览阅读174次。WWDC23为 SwiftUI 引入了许多新功能,特别是这些修改器对金属着色器的支持。_swiftui_metal

Ubuntu18.04 Server配置固定IP 以及Ubuntu19.10 Server配置固定IP_没有 50-cloud-init.yaml文件-程序员宅基地

文章浏览阅读3.1k次。一、Ubuntu18.04 Server1、查看/etc/netplan50-cloud-init.yaml文件及内容,没有文件时创建2、修改文件 ,添加 IP 地址、子网掩码、网关、DNS 服务器等配置。用192.168.1.231作为网卡enp2s0的 IP 地址,192.168.1.1作为网关地址。然后用192.168.1.1作为DNS 服务器 IP。子网掩码不清..._没有 50-cloud-init.yaml文件

linux记录所有用户的操作命令_linux 记录操作命令-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏5次。1.在/etc/profile加入如下脚本PS1="`whoami`@`hostname`:"'[$PWD]'historyUSER_IP=`who -u am i 2&gt;/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`if [ "$USER_IP" = "" ]thenUSER_IP=`hostname`fiif [ ! -d ..._linux 记录操作命令

Unit8 数组_uint8数组-程序员宅基地

文章浏览阅读5.2k次。Unit8 数组1. 理解数组2. 一位数组3. 二维数组4. 多维数组 1、认识数组软件的基本功能是处理数据,而在处理数据时,必须先进行数据持有,将数据持有之后,再对数据进行处理。我们将程序中可以临时存储数据的部分叫做容器。在java中,存储数据的容器效率最快的就是数组,也是java最基本的容器。数组,顾名思义就_uint8数组

推荐文章

热门文章

相关标签