OkHttp3工具

2,362 阅读4分钟

「这是我参与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();

两种对象的创建方法本质上是相通的,

  1. 使用构造函数创建时,会默认创建一个建造者对象并作为参数传入,以此来创建OkHttpClient对象;
  2. 使用建造者模式创建时,也是首先创建一个建造者对象,并调用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请求流程如下

  1. 创建OkHttpClient对象
  2. 创建Request请求对象,并设置请求类型、请求路径、参数等信息
  3. 使用OkHttpClient对象执行Request请求对象,并使用Response对象接收返回结果
  4. 从返回结果中获取解析返回数据

代码实现流程可以表示为:

//①创建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相比,大多数时候都会提交一定的数据信息,流程可以表示为

  1. 创建OkHttpClient对象
  2. 创建请求体对象信息
  3. 创建Request请求对象,并设置请求类型为post并携带需要提交的请求体信息、请求路径、头部参数等信息
  4. 使用OkHttpClient对象执行Request请求对象,并使用Response对象接收返回结果
  5. 从返回结果中获取解析返回数据

具体实现代码为:

//①创建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();