目录
系列文章:
//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
(一)简介
Cookie是某些网站为了辨别用户身份,进行会话跟踪(比如确定登陆状态)而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
1.情景理解
在日常生活中,当我们打开一个曾经登录过的网站时,可能会直接进入首页而不需要再次登录。这是怎么做到的呢?其实就是游览器保存了我们的cookie,里面记录了一些信息,当然,这些cookie是服务器创建后返回给游览器的,游览器只进行了保存。
![](https://i-blog.csdnimg.cn/direct/b68b121f0fd746a0acd7dc818429f0bd.png)
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);
}
}
}
运行结果