Android |(十四)网络请求3 OkHttp构建者的设置

目录

 一、拦截器 Interceptor

(一)无操作,仅经过

(二)前/后置处理

​编辑

(三)执行顺序 

二、缓存 Cache()

使用方法

三、小型文本文件 Cookie 

(一)简介

 1.情景理解

2.主要应用

3.常用属性    

(二)使用方法

运行结果


系列文章:

Android |(十四)网络请求 OkHttp-CSDN博客

Android |(十四)OkHttp——post请求的数据格式-CSDN博客

//okHttp提供构建者模式来创建okHttpClient客户端对象
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();

但是,当我们要自定义一些配置时,就不能简单的new OkHttpClient对象,而是要new它的内部类builder类的使用对象

下面介绍两种OkHttp种使用较多的三种配置 

 一、拦截器 Interceptor

        使用情况:当各个请求上传有共同部分时,例如,当和服务器进行发起通讯时,要求无论请求什么,都要说明平台和版本号

OkHttpClient okHttpClient = new OkHttpClient
                    .Builder()
                    .addInterceptor(new xx……)//或者.addNetworkInterceptor()  
                    .build();

(一)无操作,仅经过

package com.example.okhttp3;
import androidx.annotation.NonNull;
import org.junit.Test;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class interceptorDemo {
    @Test
    public void InterceptorUnitTest() throws IOException {
        //new 一个配置了拦截器的OkHttpClient对象
        OkHttpClient okHttpClient = new OkHttpClient
                .Builder()
                .addInterceptor(new Interceptor() {
                    @NonNull
                    @Override
                    public Response intercept(@NonNull Chain chain) throws IOException {
                        //如果只有下面2行代码,则什么都没有发生,相当于只是经过拦截器
                        //proceed 继续、接着做的意思
                        Request request = chain.request();
                        Response response = chain.proceed(request);

                        return response;
                    }
                })
                .build();
        //请求 (同步/异步、get/post都可以)
        //以get 同步请求为例
        Request request = new Request
            .Builder()
            .url("https://www.httpbin.org/get?a=1&b=2")
            .build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println("coderSong"+response.body().string());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

(二)前/后置处理

(三)执行顺序 

  • 拦截器可以添加无数个,按照添加顺序执行
  • addInterceptor()先执行,addNetworkInterceptor()后执行 

验证:addNetworkInterceptor()放在前面,仍然打印出了addInterceptor()中的version

二、缓存 Cache()

  • OkHttp按照Http请求-响应协议实现了缓存的处理,允许将第一次请求的响应缓存到本地
  • 默认情况下,OkHttp缓存是关闭状态,需要我们开启

        当我们发起第一次请求之后,如果后续还需要同样的请求,此时如果符合缓存规则,则可以减少与服务器的网络通信,直接从本地文件缓存中读取响应,返回给请求者。

使用方法

pathname:缓存文件地址,maxSize:缓存文件最大字节

三、小型文本文件 Cookie 

(一)简介

HTTP Cookie - HTTP | MDN

        Cookie是某些网站为了辨别用户身份,进行会话跟踪(比如确定登陆状态)而储存在用户本地终端上数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。   

 1.情景理解

        在日常生活中,当我们打开一个曾经登录过的网站时,可能会直接进入首页而不需要再次登录。这是怎么做到的呢?其实就是游览器保存了我们的cookie,里面记录了一些信息,当然,这些cookie是服务器创建后返回给游览器的,游览器只进行了保存。

csdn网站保存的cookies

2.主要应用

  • 会话状态管理:如用户登录状态、购物车、游戏分数或其他需要记录的信息
  • 个性化设置:如用户自定义设置、主题和其他设置
  • 浏览器行为跟踪:如跟踪分析用户行为等

3.常用属性    

  一般情况下,cookie是以键值对进行表示(key-value)

//cookie的名字是name,cookie携带的值是jack。
name = jack
  • Name:cookie的名字
  • Value:cookie的值
  • Path:Web站点上可以访问该Cookie的目录
  • Expires:示cookie的过期时间,也就是有效值,cookie在这个值之前都有效。
  • Size:cookie的大小

(二)使用方法

测试使用此网站:玩Android 开放API-玩Android - wanandroid.com (5.1和6.1),记住用户名和密码,按照描述进行操作

 建议将代码敲下来,认真研究注释

package com.example.okhttp3;

import androidx.annotation.NonNull;

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.Call;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class CookieUnitTest {

    //全局变量
    Map<String, List<Cookie>> cookies = new HashMap<>();//这样就可以以host作为key

    //Test方法:alt+insert
    @Test
    public void CookieUnitTest() {
        /**
         * 5.1 登录
         */
        //创建带有自定义CookieJar实现的OkHttpClient实例
        OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
            @Override
            public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {
                //看参数@NonNull List<Cookie> list,说明此函数是将服务器创建的cookie封装到List中返回给我们
                //本次测试,我们先将cookie保存到内存中,所以cookieJar
                cookies.put(httpUrl.host(), list);//保存收到的cookie到对应主机
            }

            @NonNull
            @Override
            public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
                //检索给定主机的存储cookie
                List<Cookie> cookies = CookieUnitTest.this.cookies.get(httpUrl.host());
                return cookies == null ? new ArrayList<>() : cookies;
            }
        }).build();
        //请求体
        FormBody formBody = new FormBody.Builder().add("username", "coderSong_13579").add("password", "123456").build();
        Request request = new Request.Builder().url("https://www.wanandroid.com/user/login").post(formBody).build();
        // 发送登录请求到服务器 
        Call call = okHttpClient.newCall(request);
        try {
            //登录结果可以通过response拿到
            //但是为了请求后面登录后才能请求的接口(查看收藏文章),我们还要拿到登录后返回的cookie数据信息↑
            //婉转安卓网:登录后会在cookie中返回账号密码,只要在客户端做cookie持久化存储即可自动登录验证
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        /**
         *  6.1 查看收藏文章列表(先在网站收藏几篇文章)
         */
        // 重复使用前面变量来获取收藏文章列表
        request = new Request.Builder().url("https://www.wanandroid.com/lg/collect/list/0/json").build();
        call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

运行结果 

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值