说明
一个项目中的网络请求肯定不止一个。多个的话就涉及到相同的请求信息,或者相同的信息过滤条件。
因此,就需要自定义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:\Users\Cherry”),1024*1024)) 缓存
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(new Cache(new File("C:\\Users\\Cherry"),1024*1024))
.build();
cookie
通过cookieJar(new CookieJar(){})记录到程序内
通过Map<String,List> cookieMap = new HashMap<>(); 记录个网站的cookie 。
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<String,List<Cookie>> 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<Cookie> list) {
cookieMap.put(httpUrl.host() ,list);
}
@NonNull
@Override
public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
List<Cookie> 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()