一、OkHttp3简介
OkHttp3是一个开源的Java/Android网络框架,由Square公司开发维护。它支持同步、异步请求和文件上传下载,简单易用,具有高效的速度和强大的扩展性。OkHttp3是网络请求的首选框架之一,也是Retrofit2的底层网络请求库。
二、OkHttp3 Maven配置
在pom.xml文件中添加以下依赖项:
```xmlOkHttp3是Square公司开发的,使用Maven管理依赖需要添加Square仓库。如果没有添加Square仓库,则需要在pom.xml中添加以下内容:
```xml三、OkHttp3发送HTTP请求
发送HTTP请求需要先创建OkHttpClient对象,然后创建请求对象Request和响应对象Response。发送请求可以使用同步或异步方式。
1、创建OkHttpClient对象:
```java OkHttpClient client = new OkHttpClient(); ```2、创建请求对象Request:
```java Request request = new Request.Builder() .url("http://www.example.com") .build(); ```3、同步发送请求并获取响应对象Response:
```java Response response = client.newCall(request).execute(); ```4、异步发送请求并获取响应对象Response:
```java client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { //处理响应 } }); ```使用异步方式发送请求可以避免阻塞主线程,提高应用的响应速度。
四、OkHttp3配置请求参数
OkHttpClient.Builder可以设置连接超时时间、读取超时时间、写入超时时间、重试次数、缓存等参数。Request.Builder可以设置请求头、请求参数、请求方式等参数。
1、设置超时时间:
```java OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); ```2、设置请求头:
```java Request request = new Request.Builder() .url("http://www.example.com") .addHeader("User-Agent", "Mozilla/5.0") .build(); ```3、设置请求参数:
```java FormBody formBody = new FormBody.Builder() .add("username", "admin") .add("password", "123456") .build(); Request request = new Request.Builder() .url("http://www.example.com") .post(formBody) .build(); ```4、设置请求方式:
```java Request request = new Request.Builder() .url("http://www.example.com") .get() .build(); ```五、OkHttp3处理响应
OkHttp3的响应对象Response包含响应头、响应体和响应码等信息。响应体是服务器返回的数据,可以是文本、图片、音频或视频等。根据不同的数据类型可以使用不同的方式来处理响应。
1、获取响应头:
```java Response response = client.newCall(request).execute(); System.out.println(response.headers()); ```2、获取文本响应体:
```java Response response = client.newCall(request).execute(); String body = response.body().string(); System.out.println(body); ```3、获取字节流响应体:
```java Response response = client.newCall(request).execute(); byte[] data = response.body().bytes(); ```4、下载文件响应体:
```java Response response = client.newCall(request).execute(); ResponseBody body = response.body(); InputStream in = body.byteStream(); Files.copy(in, new File("example.jpg").toPath()); in.close(); ```六、OkHttp3连接池管理
OkHttp3连接池管理可以提高应用的性能和稳定性,减少网络请求的延迟和连接失败率。默认情况下,OkHttp3会为每个主机创建一个连接池,最大连接数为5,每个连接的空闲时间为5分钟。连接池管理可以根据实际情况进行调整。
1、设置连接池和连接数:
```java ConnectionPool pool = new ConnectionPool(5, 5, TimeUnit.MINUTES); OkHttpClient client = new OkHttpClient.Builder() .connectionPool(pool) .build(); ```2、关闭连接池:
```java client.connectionPool().evictAll(); ```七、OkHttp3缓存管理
OkHttp3缓存管理可以减少网络请求的次数和流量,在没有网络的情况下使用缓存可以提高应用的响应速度。默认情况下,OkHttp3不使用缓存。缓存管理需要两个步骤:首先设置缓存目录和缓存大小,然后将cache对象传递给Okhttpclient中。
1、设置缓存目录和缓存大小:
```java Cache cache = new Cache(new File("cache"), 10 * 1024 * 1024); OkHttpClient client = new OkHttpClient.Builder() .cache(cache) .build(); ```2、清空缓存:
```java client.cache().evictAll(); ```八、OkHttp3日志管理
OkHttp3提供了一个Interceptor用于捕获请求和响应的日志。开启日志需要添加以下依赖项:
```xml在OkHttpClient.Builder中添加拦截器即可开启日志:
```java HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .build(); ```九、OkHttp3异常处理
网络请求过程中可能会出现各种异常,需要使用try-catch语句进行捕获并处理。常见的异常有IOException、SocketTimeoutException、SSLHandshakeException等。
1、IOException异常:
```java try { Response response = client.newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } ```2、SocketTimeoutException异常:
```java OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); try { Response response = client.newCall(request).execute(); } catch (SocketTimeoutException e) { e.printStackTrace(); } ```3、SSLHandshakeException异常:
```java OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(sslContext.getSocketFactory(), trustManager) .hostnameVerifier((hostname, session) -> true) .build(); try { Response response = client.newCall(request).execute(); } catch (SSLHandshakeException e) { e.printStackTrace(); } ```十、完整例子
下面是一个完整的例子,用于发送POST请求,并处理响应的文本数据。
```java public static void main(String[] args) throws IOException { System.out.println(doPost("http://www.example.com/login", "username=admin&password=123456")); } public static String doPost(String url, String requestBody) throws IOException { OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); RequestBody body = RequestBody.create(requestBody, MediaType.parse("application/x-www-form-urlencoded")); Request request = new Request.Builder() .url(url) .addHeader("User-Agent", "Mozilla/5.0") .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); return response.body().string(); } } ```十一、总结
本文从OkHttp3的简介、Maven配置、HTTP请求、请求参数配置、处理响应、连接池管理、缓存管理、日志管理、异常处理等多个方面对OkHttp3进行了详细的介绍和演示。OkHttp3是一个高效、易用、可扩展的网络框架,可以满足大部分的HTTP请求和响应处理需求。在具体使用时,需要根据实际情况进行调整和优化,以满足应用的性能和稳定性要求。