「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」
OkHttp:An HTTP+HTTP/2 client for Android and Java applications.
1. 基础知识
1.1 简单介绍
OkHttp是一个比较火的Http连接工具三方库,可以说是为高效而生,使用时也是比较简洁方便。
当下普遍使用的是OkHttp3,此版本与之前的OkHttp版本相比有了较大的改进,文章内容的实现都是基于OkHttp3版本。
1.2 引入依赖
使用OkHttp需要引入相关的maven依赖信息:
<!--OkHttp3-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>
2. 常用类对象
2.1 OkHttpClient对象
使用HTTP工具时,总是少不了创建Client对象来完成相关功能,OkHttp3中需要创建的是一个OkHttpClient对象,创建时可以直接使用构造函数来创建对象;或者使用OkHttp3提供的建造者模式来创建并返回一个对象。
//①使用构造函数初始化
OkHttpClient okHttpClient = new OkHttpClient();
//②使用建造者模式创建并返回对象
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
两种对象的创建方法本质上是相通的,
- 使用构造函数创建时,会默认创建一个建造者对象并作为参数传入,以此来创建OkHttpClient对象;
- 使用建造者模式创建时,也是首先创建一个建造者对象,并调用build()方法把自身传入来返回OkHttpClient对象。
//①使用构造函数
public OkHttpClient() { this(new OkHttpClient.Builder()); }
//②使用建造者模式
public OkHttpClient build() { return new OkHttpClient(this); }
2.2 Request对象
Request对象是进行HTTP请求时的请求对象,该类在OkHttp3中同样是使用了建造者模式的思想来创建一个请求对象,创建时操作的是Request类中的Builder内部类,并通过Builder内部类将属性传递给Request对象,创建时默认请求类型是GET请求。
//建造者模式创建请求对象,默认是GET请求
Request request = new Request.Builder().build();
如果想要自定义请求类型,Request类中提供了method()方法可以指定请求类型,同时对于常用的请求方式还做了进一步封装,如可以调用.post()方法以POST类型发送请求。
//method方法设置请求方式
public Request.Builder method(String method, @Nullable RequestBody body){
...
}
//封装的get、post方法,调用即可使用相应请求类型
public Request.Builder get() {
return this.method("GET", (RequestBody)null);
}
public Request.Builder post(RequestBody body) {
return this.method("POST", body);
}
指定请求路径可以使用Request对象的url()
方法,该方法可以传入一个字符串或URL对象。
//通过url方法对建造者对象的url属性赋值,其他方法都是间接调用该方法
public Request.Builder url(HttpUrl url) {
if (url == null) {
throw new NullPointerException("url == null");
} else {
this.url = url;
return this;
}
}
除了设置请求类型和路径的方法之外,Request类中还提供了设置请求头部信息的方法
//设置请求头
public Request.Builder header(String name, String value) {
this.headers.set(name, value);
return this;
}
//追加请求头信息
public Request.Builder addHeader(String name, String value) {
this.headers.add(name, value);
return this;
}
//通过头部对象设置请求头信息
public Request.Builder headers(Headers headers) {
this.headers = headers.newBuilder();
return this;
}
2.3 Response对象
Response对象是HTTP请求后的响应对象,Response类在OkHttp3中同样是使用了建造者模式。
在HTTP的响应Response对象中,常用的操作就是从响应结果中获取响应数据,Response对象中提供了body()方法来获取响应结果中的响应体内容。
//获取相应体
@Nullable
public ResponseBody body() {
return this.body;
}
3. 请求流程
3.1 GET请求
使用OkHttp工具进行GET请求流程如下
- 创建OkHttpClient对象
- 创建Request请求对象,并设置请求类型、请求路径、参数等信息
- 使用OkHttpClient对象执行Request请求对象,并使用Response对象接收返回结果
- 从返回结果中获取解析返回数据
代码实现流程可以表示为:
//①创建OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
//②创建Request请求对象
Request request = new Request.Builder().get().url(url).build();
//③执行请求,获取返回结果
Response response = okHttpClient.newCall(request).execute();
//④获取返回数据
response.body().toString();
3.2 POST请求
POST请求与GET相比,大多数时候都会提交一定的数据信息,流程可以表示为
- 创建OkHttpClient对象
- 创建请求体对象信息
- 创建Request请求对象,并设置请求类型为post并携带需要提交的请求体信息、请求路径、头部参数等信息
- 使用OkHttpClient对象执行Request请求对象,并使用Response对象接收返回结果
- 从返回结果中获取解析返回数据
具体实现代码为:
//①创建OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
//②创建请求体信息
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json)
//③创建Request请求对象,post类型并传入请求体
Request request = new Request.Builder().post(requestBody).url(url).build();
//④执行请求,获取返回结果
Response response = okHttpClient.newCall(request).execute();
//⑤获取返回数据
response.body().toString();