OkHttp的简介
OKhttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级网络框架。
- 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
- 连接池减少请求延时
- 透明的GZIP压缩减少响应数据的大小
- 缓存响应内容,避免一些完全重复的请求
- OkHttp支持任何Android 2.3以上平台,并且需要JDK 1.7以上。
OkHttp的使用
- 安装依赖:
implementation "com.squareup.okhttp3:okhttp:4.9.0"
- 在AndroidManifest文件中加上网络权限,和application同级:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
- 同步、异步请求
public void getSync(){
//新建一个OkHttpClient对象
OkHttpClient client = new OkHttpClient();
//创建一个request对象
Request request = new Request.Builder()
.get() //默认get
.url(url)
.build();
//准备call请求对象
Call call = client.newCall(request);
//发起同步请求
try{
Response response = call.execute();
System.out.println(response.body().string());
}catch(IOException e){
e.printStackTrace();
}
}
public void getAsync(){
//新建一个OkHttpClient对象
OkHttpClient client = new OkHttpClient();
//创建一个request对象
Request request = new Request.Builder().url(url).build();
//准备call请求对象
Call call = client.newCall(request);
//发起异步请求
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
if(response.isSuccessful())//返回码200-299
{
System.out.println(response.body().string());
}
}
});
}
public void postSync(){
OkHttpClient client = new OkHttpClient();
FormBody formBody = new FormBody.Builder().add("name","julian").add("age","25").build();
Request request = new Request.Builder()
.url("https://www.httpbin.com/")
.post(formBody)
.build();
//准备call请求对象
Call call = client.newCall(request);
//发起同步请求
try{
Response response = call.execute();
System.out.println(response.body().string());
}catch(IOException e){
e.printStackTrace();
}
}
public void postAsync(){
OkHttpClient client = new OkHttpClient();
FormBody formBody = new FormBody.Builder().add("name","julian").add("age","25").build();
Request request = new Request.Builder()
.url("https://www.httpbin.com/")
.post(formBody)
.build();
//准备call请求对象
Call call = client.newCall(request);
//发起异步请求
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
if(response.isSuccessful())//返回码200-299
{
System.out.println(response.body().string());
}
}
});
}
Post请求的数据格式
OkHttp 自定义配置
拦截器
使用场景,我们在发送请求之前或者之后做一些处理需要用到拦截器。
public void OkHttpClentTest(){
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
//前置处理,比如给每次请求头中加上系统和版本号
Request request = chain.request().newBuilder()
.addHeader("os","android")
.addHeader("version","1.0")
.build();
Response response = chain.proceed(request);
//后置处理
return response;
}
}).build();
FormBody formBody = new FormBody.Builder().add("name","julian").add("age","25").build();
Request request = new Request.Builder()
.url("https://www.httpbin.org/post")
.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();
}
}
缓存
缓存,当发起相同的请求,直接从缓存中获取,避免重复的网络请求
OkHttp配置缓存:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(new Cache(new File("/user/julian/path_of_cache_file"), 1024*1024))// 缓存文件位置、大小(1M)
.build();
cookie
先登录,获取cookie保存在内存中map,再带上cookie请求文章列表
public class CookieTest {
Map<String, List<Cookie>> cookies = new HashMap<>();
@Test
public void cookieTest(){
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(new CookieJar() {
@Override
public void saveFromResponse(@NotNull HttpUrl httpUrl, @NotNull List<Cookie> list) {
cookies.put(httpUrl.host(), list);
}
@NotNull
@Override
public List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {
List<Cookie> cookie = CookieTest.this.cookies.get(httpUrl.host());
return cookie == null ? new ArrayList<Cookie>() : cookie;
}
})
.build();
FormBody formBody = new FormBody.Builder()
.add("username","用户名")
.add("password","密码").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();
}
//okHttpClient从map中拿到cookie,需要使用cookie,请求文章列表
Request request1 = new Request.Builder()
.url("https://www.wanandroid.com/lg/collect/list/0/json")
.get()
.build();
//准备call请求对象
Call call1 = okHttpClient.newCall(request1);
//发起同步请求
try{
Response response1 = call1.execute();
System.out.println(response1.body().string());
}catch(IOException e){
e.printStackTrace();
}
}
}