okhttp是当下主流的网络请求的开源框架,效率很高,使用起来也非常方便,本文就来讲解一下okhttp的具体使用
一、整体流程
先上代码,发起一个GET请求的完整流程如下
//创建okhttp客户端
//在实际项目中,应该复用OkHttpClient,做成配置类交给spring容器管理
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
//连接失败时是否重试
.retryOnConnectionFailure(false)
//连接池
.connectionPool(new ConnectionPool(200, 5, TimeUnit.MINUTES))
//连接超时
.connectTimeout(30, TimeUnit.SECONDS)
//读超时
.readTimeout(30, TimeUnit.SECONDS)
//写超时
.writeTimeout(30, TimeUnit.SECONDS)
.build();
//构建url
HttpUrl httpUrl = HttpUrl.parse("http://localhost:8080/hello");
HttpUrl.Builder builder = httpUrl.newBuilder();
builder.addQueryParameter("param1", "value");
httpUrl = builder.build();
// HttpUrl httpUrl = new HttpUrl.Builder()
// //通信协议
// .scheme("http")
// //域名
// .host("localhost")
// //路径
// .addPathSegment("hello")
// //请求参数
// .addQueryParameter("param1", "value")
// //端口号
// .port(8080)
// .build();
//构建请求
Request request = new Request.Builder()
//GET请求方式
.get()
//HttpUrl或url字符串
.url(httpUrl)
.build();
//创建一个通话
Call call = okHttpClient.newCall(request);
//执行请求,结束时关闭连接
try (Response response = call.execute()) {
//返回响应
if (response.isSuccessful() && 200 == response.code()) {
//将响应体转化成字符串
System.out.println(response.body().string());
} else {
//失败时返回失败信息
System.out.println(response.message());
}
} catch (IOException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
POST请求
//创建okhttp客户端
//在实际项目中,应该复用OkHttpClient,做成配置类交给spring容器管理
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
//连接失败时是否重试
.retryOnConnectionFailure(false)
//连接池
.connectionPool(new ConnectionPool(200, 5, TimeUnit.MINUTES))
//连接超时
.connectTimeout(30, TimeUnit.SECONDS)
//读超时
.readTimeout(30, TimeUnit.SECONDS)
//写超时
.writeTimeout(30, TimeUnit.SECONDS)
.build();
String json = "{\"param\":\"value\"}";
//构建url
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);
//构建请求
Request request = new Request.Builder()
//POST请求方式
.post(body)
//HttpUrl或url字符串
.url("http://localhost:8080/hello")
.build();
//创建一个通话
Call call = okHttpClient.newCall(request);
//执行请求,结束时关闭连接
try (Response response = call.execute()) {
//返回响应
if (response.isSuccessful() && 200 == response.code()) {
//将响应体转化成字符串
System.out.println(response.body().string());
} else {
//失败时返回失败信息
System.out.println(response.message());
}
} catch (IOException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
二、实体类讲解
1.OkHttpClient
okhttp使用OkHttpClient来创建网络请求,因此首先应该创建一个OkHttpClient。
使用OkHttpClient来配置发起网络请求的各种参数,如超时时间,连接池,是否重试等等。
另外OkHttpClient应该是全局唯一的,没必要重复创建,这样才可以使用连接池来提供使用效率。
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
//连接失败时是否重试
.retryOnConnectionFailure(false)
//连接池
.connectionPool(new ConnectionPool(200, 5, TimeUnit.MINUTES))
//连接超时
.connectTimeout(30, TimeUnit.SECONDS)
//读超时
.readTimeout(30, TimeUnit.SECONDS)
//写超时
.writeTimeout(30, TimeUnit.SECONDS)
.build();
2.HttpUrl
每一个http请求首先要有一个请求的url地址。因此我们首先需要构建一个HttpUrl。
可以配置通信协议,域名,端口号,路径等等。
HttpUrl httpUrl = new HttpUrl.Builder()
//通信协议
.scheme("http")
//域名
.host("localhost")
//路径
.addPathSegment("hello")
//请求参数
.addQueryParameter("param1", "value")
//端口号
.port(8080)
.build();
也可以直接传入一个url字符串
HttpUrl httpUrl = HttpUrl.parse("http://localhost:8080/hello");
HttpUrl.Builder builder = httpUrl.newBuilder();
builder.addQueryParameter("param1", "value");
httpUrl = builder.build();
3.RequestBody
如果是POST请求的话,就需要一个请求体,可以在请求体中添加参数
String json = "{\"param\":\"value\"}";
//构建url
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);
3.Request
有了HttpUrl后,就可以构建一个请求,也就是Request类
Request request = new Request.Builder()
//请求方式为GET
.get()
//HttpUrl或url字符串
.url(httpUrl)
.build();
Request request = new Request.Builder()
//POST请求方式
.post(body)
//HttpUrl或url字符串
.url("http://localhost:8080/hello")
.build();
3.Call
有了Request后,就可以使用okHttpClient来创建一个通话,此时请求还未执行。
使用execute()发起同步请求,使用enqueue()发起异步请求。
//创建一个通话
Call call = okHttpClient.newCall(request);
Response response = call.execute();
4.Response
使用Call发起请求,得到目标服务器的响应后,会返回一个Response对象。
可以从Response中获取响应体,获得通信结果,状态码等。
//返回响应
if (response.isSuccessful() && 200 == response.code()) {
//将响应体转化成字符串
System.out.println(response.body().string());
} else {
//失败时返回失败信息
System.out.println(response.message());
}