OkHttp工具类详解

发布时间:2023-05-18

一、OkHttp简介

OkHttp是一个安卓平台和Java的HTTP客户端,用于向Web服务器发送和接收数据。它非常适合处理大量的网络数据流和Web服务。OkHttp使用清晰度很高的API进行简化,并且使用方便。 是当前使用最广泛的网络请求库之一,Retrofit就是基于OkHttp封装完成的

二、OkHttp的主要功能

  1. 自动处理常见的协议,如HTTP 1.1, SPDY和HTTP/2。
  2. 连接池技术: OkHttp可以跨请求自动重用HTTP和SPDY连接。它通过连接池技术来减少网络延迟。连接池还能节省您的电池
  3. 请求压缩传输: OkHttp支持Gzip压缩传输,它可以减少数据传输量从而减少网速慢时的等待时间
  4. 能够处理故障:OkHttp尝试合理地处理故障,比如无法访问的地址,超时,以及空输出流等。
  5. 支持通过HTML表单进行POST数据提交

三、OkHttp的使用

1.引入OkHttp依赖

在项目的build.gradle文件的dependencies属性下添加OkHttp的依赖

implementation 'com.squareup.okhttp3:okhttp:3.12.7'

2.创建OkHttpClient对象

在调用网络请求之前,需要先创建一个OkHttpClient对象

OkHttpClient okHttpClient = new OkHttpClient();

如果需要设置一些参数,则可以在创建OkHttpClient对象时进行设置。比如超时时间、设置请求头等,例如:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .addInterceptor(new UserAgentInterceptor("Mozilla/5.0 (Windows NT 10.0; WOW64)"))
    .build();

3.创建Request对象

使用OkHttp发送请求,需要先构建一个Request对象,包含url,头部信息、请求类型和请求体等。最常用的是GET和POST请求, 分别使用Request.Builder对应的方法创建Request对象 例如创建一个GET请求:

Request request = new Request.Builder()
    .url("http://www.example.com")
    .build();

创建一个POST请求:

RequestBody requestBody = new FormBody.Builder()
    .add("username", "admin")
    .add("password", "123456")
    .build();
Request request = new Request.Builder()
    .url("http://www.example.com/login")
    .post(requestBody)
    .build();

4.发送请求

最后,我们使用前面创建好的OkHttpClient和Request对象来调用网络请求。这个网络请求一般是异步的,并且返回回调结果。然后我们在回调结果里面完成具体的业务操作。 例如:

Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 异常回调
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        // 成功回调
        String result = response.body().string();
    }
});

四、OkHttp的小技巧

1.设置Https证书

当访问的是https链接时,可能需要设置证书进行认证。例如:

OkHttpClient.Builder builder = new OkHttpClient.Builder();
try {
    InputStream is = getAssets().open("xxx.cer");
    SSLSocketFactory sslSocketFactory = new HttpsUtils.SSLParams(null, is, null).getSSLFactory();
    builder.sslSocketFactory(sslSocketFactory);
} catch (IOException e) {
    e.printStackTrace();
}
okHttpClient = builder.build(); 

2.添加请求头

有时候需要在请求头里面添加一些特定的参数,例如用户认证信息等。可以用addHeader()方法:

Request request = new Request.Builder()
        .url("http://www.example.com")
        .addHeader("Authorization", "Bearer " + token)
        .build();

3.取消请求

当网络较差时,网络请求可能会被阻塞或延迟返回结果。在一些情况下,可以考虑取消请求,比如用户重新发起请求。

Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 异常回调
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        // 成功回调
        String result = response.body().string();
    }
});
// 取消请求
call.cancel();

4.设置超时时间

设置请求超时时间可以避免由网络问题造成的超时等待,可以使用OkHttpClient.Builder的connectTimeout()、readTimeout()和writeTimeout()方法分别设置连接超时、读取超时和写入超时时间,例如:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .build();

5.自定义拦截器

使用拦截器可以拦截并处理所有的请求和响应 例如实现一个自定义的UserAgentInterceptor,用于在请求头中添加User-Agent字段,可以识别不同的客户端类型:

public class UserAgentInterceptor implements Interceptor {
    private String userAgent;
    public UserAgentInterceptor(String userAgent) {
        this.userAgent = userAgent;
    }
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request()
                .newBuilder()
                .addHeader("User-Agent", userAgent)
                .build();
        return chain.proceed(request);
    }
}

这样使用以下代码就可以在请求头中自动添加"User-Agent"字段了:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .addInterceptor(new UserAgentInterceptor("Mozilla/5.0 (Windows NT 10.0; WOW64)"))
    .build();

五、总结

本文简单介绍了OkHttp的主要功能和使用方法,以及一些小技巧。OkHttp作为安卓平台和Java的HTTP客户端,其使用简单、功能强大,可以快速的进行网络请求。因此,大家可以放心使用OkHttp来获取网络数据,提高应用的用户体验。