飞道的博客

【Android-网络编程】OKHttp使用总结

439人阅读  评论(0)

本文总结归纳了OKHttp的使用步骤和使用时的注意事项。
okhttp的介绍:相比于利用API写网络请求,使用okhttp框架可以简化代码量,这是官方对okhttp的解释说明:

HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。有效地执行HTTP可使您的内容加载更快并节省带宽。
OkHttp是默认情况下有效的HTTP客户端:

  1. HTTP / 2支持允许对同一主机的所有请求共享一个套接字。
  2. 连接池可减少请求延迟(如果HTTP / 2不可用)。
  3. 透明的GZIP缩小了下载大小
  4. 应缓存可以完全避免网络重复请求。

当网络出现问题时,OkHttp会坚持不懈:它将从常见的连接问题中静默恢复。如果您的服务具有多个IP地址,则在第一次连接失败时,OkHttp将尝试使用备用地址。这对于IPv4 + IPv6和冗余数据中心中托管的服务是必需的。 OkHttp支持现代TLS功能(TLS 1.3,ALPN,证书固定)。可以将其配置为回退以实现广泛的连接。
使用OkHttp很容易。它的请求/响应API具有流畅的构建器和不变性。它支持同步阻塞调用和带有回调的异步调用。

——————————————————————————————————————————————
OKHttp的使用步骤:(以get请求为例)

  1. 申请网络权限,网络安全配置
  2. 添加okhttp依赖
  3. 创建client
  4. 创建连接,设置请求的内容
  5. client去发起请求
  6. 执行任务(同步/异步)

1、申请网络权限,网络安全配置

1.1 申请网络权限

要连接网络都需要去申请网络请求的权限,在manifest中添加:

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

注意: 如果使用的是模拟机,则模拟机也要打开网路,模拟机如何连网

1.2 网络安全配置

在安卓8.0以上(即API 26以上),如果要使用http协议的话需要进行网络安全配置

法一:在manifest中添加该语句:

android:usesCleartextTraffic="true"

法二:新建一个配置文件,设置以下内容,再将配置文件设置到manifest中

network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <domain-config cleartextTrafficPermitted="true">
        </domain-config>
    </domain-config>
</network-security-config>

manifest:

android:networkSecurityConfig="@xml/network_security_config"

2、添加okhttp依赖

在app下的build.gradle中添加该语句,然后sync一下即可使用okhttp了:

implementation("com.squareup.okhttp3:okhttp:4.5.0")

3、创建client

在使用okhttp时,首先要创建一个client:
此处设置了服务器响应时间

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .connectTimeout(10000, TimeUnit.MILLISECONDS)
        .build();   	//build是构建者模式

4、创建连接,设置请求的内容

此处设置了请求方式和URL

Request request = new Request.Builder()
        .get()          //get方法
        .url(BASE_URL + "/get/text")
        .build();

5、client去发起请求

把请求任务(request)给client去发起请求,此时就有了一个任务

Call task = okHttpClient.newCall(request);

6、执行任务

此处选择同步/异步的方式执行任务:
同步: 发起请求后等待数据响应完成后在继续其他操作(A -> B -> C)
异步: 发起请求后在等待数据响应的期间可以先执行其他操作(A -> D -> E -> F-> B -> C)推荐使用异步操作

同步:需要创建一个子线程与主线程同步执行操作

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Response execute = task.execute();
            int responseCode = execute.code();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                //获取到请求头的信息
                Headers headers = execute.headers();
                for (int i = 0; i < headers.size(); i++) {
                    String name = headers.name(i);
                    String value = headers.value(i);
                    Log.d(TAG, name + "  ==  " + value);
                }
                InputStream inputStream = execute.body().byteStream();
                downloadFile(inputStream, headers);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}).start();

异步:

task.enqueue(new Callback() {
    @Override
    public void onFailure(@NotNull Call call, @NotNull IOException e) {
        //失败时
        Log.d(TAG, "failure...." + e.toString());
    }

    @Override
    public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
        //响应时
        int code = response.code();
        if (code == HttpURLConnection.HTTP_OK) {
            ResponseBody body = response.body();
            Log.d(TAG, "body is " + body.string());    //此处一定要使用string()方法!
        }
        Log.d(TAG, "response code is " + code);
    }
});

以上就是okhttp发起请求时候的步骤,如果是post请求则在第三步中设置请求内容的时候将.get()改为.post()即可


转载:https://blog.csdn.net/qq_40716430/article/details/105775749
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场