一个项目中的网络请求肯定不止一个。多个的话就涉及到相同的请求信息,或者相同的信息过滤条件。
因此,就需要自定义OkHttp3设置。可以通过拦截器、过滤器实现
测试方法都是在test 测试用例中进行的
拦截器 应用拦截器使用addInterceptor
new OkHttpClient.Builder().addInterceptor(new Interceptor() { //应用拦截器 @NonNull @Override public Response intercept(@NonNull Chain chain) throws IOException { Request request = chain.request().newBuilder().addHeader("SystemType", "android") .addHeader("version", "20220803.001.123") .build(); System.out.println("version2"+chain.request().headers("version")); Response response = chain.proceed(request); return response; //正常返回,不处理 //return chain.proceed(chain.request()); } }).build();网络拦截器
使用addNetworkInterceptor
new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() { //网络拦截器 @NonNull @Override public Response intercept(@NonNull Chain chain) throws IOException { System.out.println("version"+chain.request().headers("version")); Request request = chain.request().newBuilder().addHeader("locDesc", "cwc") .addHeader("userName", "lianmei") .build(); Response response = chain.proceed(request); return response; } }) .build();
备注
1、addInterceptor早于addNetworkInterceptor执行
2、addInterceptor是程序增加的,
addNetworkInterceptor是网络增加,可以获取addInterceptor的请求信息
3、addInterceptor不管有误网络都会执行,
addNetworkInterceptor,有网络是才执行,没有网络时不执行
过滤器最终代码
package com.pha.four; 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 OkHttpSetting { @Test public void InterCeptorTest() { OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() { //应用拦截器 @NonNull @Override public Response intercept(@NonNull Chain chain) throws IOException { Request request = chain.request().newBuilder().addHeader("SystemType", "android") .addHeader("version", "20220803.001.123") .build(); System.out.println("version2"+chain.request().headers("version")); Response response = chain.proceed(request); return response; //正常返回,不处理 //return chain.proceed(chain.request()); } }).addNetworkInterceptor(new Interceptor() { //网络拦截器 @NonNull @Override public Response intercept(@NonNull Chain chain) throws IOException { System.out.println("version"+chain.request().headers("version")); Request request = chain.request().newBuilder().addHeader("locDesc", "cwc") .addHeader("userName", "lianmei") .build(); Response response = chain.proceed(request); return response; } }) .build(); Request request = new Request.Builder().url("http://www.httpbin.org/get?a=2&b=3") .build(); Call call = okHttpClient.newCall(request); Response response = null; try { response = call.execute(); System.out.println(response.body().string()); } catch (IOException e) { e.printStackTrace(); } } }缓存和cookie 缓存
通过.cache(new Cache(new File(“C:UsersCherry”),1024*1024)) 缓存
OkHttpClient okHttpClient = new OkHttpClient.Builder() .cache(new Cache(new File("C:\Users\Cherry"),1024*1024)) .build();cookie
通过cookieJar(new CookieJar(){})记录到程序内
通过Map
package com.pha.four; 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 OkHttpCookieTest { Map记忆点> cookieMap = new HashMap<>(); @Test public void CookieTest() { OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() { //记录cookies @Override public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List list) { cookieMap.put(httpUrl.host() ,list); } @NonNull @Override public List loadForRequest(@NonNull HttpUrl httpUrl) { List cookies = OkHttpCookieTest.this.cookieMap.get(httpUrl.host()); return cookies == null ? new ArrayList<>() : cookies; } }).build(); FormBody formBody = new FormBody.Builder().add("username","ty082093105") .add("password","123123") .build(); Request request = new Request.Builder().url("https://www.wanandroid.com/user/login") .post(formBody) .build(); Call call = okHttpClient.newCall(request); try { Response response = call.execute(); System.out.println(response.body().string()); } catch (IOException e) { e.printStackTrace(); } //使用cookies 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) { e.printStackTrace(); } } }
1、应用拦截器addInterceptor
2、网络拦截器addNetworkInterceptor
3、缓存cache
4、cookie记录:cookieJar(new CookieJar(){}).build()