您的位置:

OkHttp工具类详解

一、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来获取网络数据,提高应用的用户体验。