okhttp简介

583 阅读3分钟

okhttp简介

http是现代应用常用的一种交换数据和媒体的网络方式,高效地使用Http能让资源加载更快,节省带宽。

OKHttp是一个高效的http客户端,它有以下默认特征:

1.支持Http/2,允许所有同一个主机地址的请求共享同一个socket连接
2.连接池减少请求延时
3.透明的GZIP压缩减少响应数据的大小
4.缓存响应内容,避免一些完全重复的请求

HTTP/ 2是超文本传输协议(HTTP)的最新版本,一种新的协议。它用于传输数据,这将大大加快网络速度,并可以帮助优化搜索引擎。

Socket接口是TCP/IP网络的API(Application Programming Interface,应用程序编程接口),Socket接口定义了许多函数或例程,程序员可以用它们来开发 TCP/IP网络上的应用程序。

OkHttp在网络出现问题时坚持:它会从常见的连接问题中默默恢复。如果您的服务有多个 IP 地址,则 OkHttp 将在第一次连接失败时尝试备用地址。这对于在冗余数据中心托管的 IPv4+IPv6 和服务是必需的。OkHttp 支持现代 TLS 功能(TLS 1.3、ALPN、证书锁定)。它可以配置为回退以实现广泛的连接。

使用:

添加权限

<uses-permission android:name="android.permission.INTERNET"/>

添加依赖

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

OKHttp同步和异步

1.1、同步 同步请求是指在请求发起到拿到响应结果之前,程序一直会处于阻塞状态,无法接收新的请求,直至拿到响应

同步请求的好处在于:理解简单;实现简单;可以将响应结果返回做后续处理;

同步请求的缺点在于:不能支持高并发的情况,在对请求响应实时性要求不高的场景下,会影响性能

1.2、异步 异步请求是指请求发起后到拿到响应结果之前,程序是非阻塞状态,可以继续接收新的请求,响应回来时会调用一个回调处理响应数据

异步请求的好处在于:支持高并发的接口请求

异步请求的缺点在于:实现复杂;响应结果只能输出,不能返回,不利于接口的后续处理

异步GET请求 -new OkHttpClient; -构造Request对象; -通过前两步中的对象构建Call对象; -通过Call#enqueue(Callback)方法来提交异步请求;

OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
        .url(url)
        .get()//默认就是GET请求,可以不写
        .build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Log.d(TAG, "onFailure: ");
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Log.d(TAG, "onResponse: " + response.body().string());
    }
}); 

异步发起的请求会被加入到 Dispatcher 中的 runningAsyncCalls双端队列中通过线程池来执行。

同步GET请求 前面几个步骤和异步方式一样,只是最后一部是通过 Call#execute() 来提交请求,注意这种方式会阻塞调用线程,所以在Android中应放在子线程中执行,否则有可能引起ANR异常,Android3.0 以后已经不允许在主线程访问网络。

String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
        .url(url)
        .build();
final Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Response response = call.execute();
            Log.d(TAG, "run: " + response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();