Android网络请求 |(二) OkHttp简介

上一篇:Android权限操作之uses-permission详解-CSDN博客

一、Android 网络库的发展

        Google在Android4.4以后开始将源码中的 HttpuRLconnection 底层实现替换为 oKHttp,同时现在流行的 Retrofit 框架底层同样是使用oKHttp

二、★ OkHttp

官网: Overview - OkHttp

gitHub: GitHub - square/okhttp

使用帮助文档:OkHttp 3.14.0 API

(一)出现背景

        网络访问的高效性要求,为高效而生 

(二)定义与作用

        OkHttp一个适用于Android和Java应用程序支持Android 2.3及以上、Java最低1.7版本)、默认高效HTTP和HTTP/2客户端,由Square公司提供的开源网络请求框架

        作用:通过建造者模式(Builder Pattern),完成复杂的网络请求

建造者模式属于设计模式三大类型中创建型

(三)高级功能

  1. 支持HTTP/2:支持允许对同一主机的所有请求共享一个套接字
  2. 连接池:重用 HTTP 和 HTTPS 连接,减少了请求延迟和 TCP 连接开销
  3. 透明GZIP:缩小了下载大小,减少网络传输数据量
  4. 响应缓存:完全避免了重复请求的网络,提高访问速度
  5. 请求重试:在连接失败时,自动重试一个主机的多个 IP 地址
  6. 在较高的层次上,客户端被设计用于阻止同步调用非阻止异步调用

(四)OkHttp3设计思路

OkHttp3是OkHttp的最新版本,强烈建议跟随官网随时更新OkHttp

三、OkHttp使用

(一)添加依赖+网络权限

//build.grade(app)
//dependencies
implementation("com.squareup.okhttp3:okhttp:4.12.0")
 <uses-permission android:name="android.permission.INTERNET"/>

测试URL (统一资源定位符)https://www.httpbin.org/ (后面会用到)

(二)使用演示

这里只演示 get post,    建议将代码复制下来,认真看注释

  • 同步请求:发出请求后,阻塞不能继续做任何事,请求返回后才能继续做事;
  • 异步请求:发出请求后,可去做其他事,请求完成后,有回调,会通知你处理这个回应。

步骤

  1. new 客户端对象OkHttpClient
  2. new 请求对象  Request
  3. 生成 call对象, 发送登录请求到服务器
  4. call发起请求(同步/异步),得到回应 response

准备

如果运行出错,可以一直clean、rebuild一下项目试试

1.get 同步请求

private OkHttpClient okHttpClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.new客户端对象OkHttpClient
        okHttpClient = new OkHttpClient();

    }
 //get 同步请求
    public void get_sync(View view) {
        //Android中网络请求必须启动一个子线程,在线程中完成请求
        new Thread() {
            @Override
            public void run() {
                super.run();
                //2.new请求Request,构建url,并上传参数
                Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
                //3.生成Call请求对象
                Call call = okHttpClient.newCall(request);
                // 4.Call发起请求(同步/异步)
                try {
                    Response response = call.execute();
                    //5
                    Log.i("coderSong", "get 同步请求" + response.body().string());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }.start();
    }

2.get 异步请求 

不需要我们启动子线程(enqueue本身会启动),可以在主线程中直接使用

//get 异步请求
public void get_async(View view) {
        //2.new 请求
        Request request = new Request.Builder().url("https://www.httpbin.org/get?c=3").build();
        //3.call对象
        Call call = okHttpClient.newCall(request);
        //4.发起请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                //请求失败
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                //仅代表和服务器通信成功,不代表和https通信成功(比如可能返回404 Found)
                if (response.isSuccessful()) {
                    Log.i("coderSong", "get 异步请求" + response.body().string());
                }
            }
        });
    }

1.请求默认是get的,如果要post,只需在后面加上.post

2.get请求参数加在?后面,post请求参数必须在单独的请求体中

3.post 同步请求

//post 同步请求
public void post_sync(View view) {
        new Thread() {
            @Override
            public void run() {
                super.run();
                FormBody formBody = new FormBody.Builder().add("e", "1").add("f", "2").build();

                //2.new请求Request,构建url,并上传参数
                Request request = new Request.Builder()
                        .url("https://www.httpbin.org/post")
                        .post(formBody).build();
                //3.生成Call请求对象
                Call call = okHttpClient.newCall(request);
                // 4.Call发起请求(同步/异步)
                try {
                    Response response = call.execute();
                    //5
                    Log.i("coderSong", "post 同步请求" + response.body().string());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }.start();
    }

4.post 异步请求 

//post 异步请求
public void post_async(View view) {
        FormBody formBody = new FormBody.Builder().add("g", "g").build();
        //2.new 请求
        Request request = new Request.Builder()
                .url("https://www.httpbin.org/post")
                .post(formBody)
                .build();
        //3.call对象
        Call call = okHttpClient.newCall(request);
        //4.发起请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                //请求失败
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                //仅代表和服务器通信成功,不代表和https通信成功(比如可能返回404 Found)
                if (response.isSuccessful()) {
                    Log.i("coderSong", "post 异步请求" + response.body().string());
                }
            }
        });
    }

好的,下面是一个简单的例子,演示如何在Android Studio中使用OkHttp库实现HTTPS请求。 首先,在build.gradle文件中添加OkHttp库的依赖,如下所示: ``` dependencies { implementation 'com.squareup.okhttp3:okhttp:4.9.0' } ``` 接着,在需要发起HTTPS请求的代码中,我们可以使用OkHttp的"OkHttpClient"类来创建一个可以处理HTTPS请求的客户端,如下所示: ``` public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建OkHttpClient实例 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); // 创建Request对象 Request request = new Request.Builder() .url("https://www.example.com/api/data") .build(); // 发起请求 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "onFailure: " + e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { String responseData = response.body().string(); Log.d(TAG, "onResponse: " + responseData); } }); } } ``` 在上述代码中,我们首先创建了一个OkHttpClient实例,并设置了连接超时、读取超时和写入超时时间。然后,我们创建了一个Request对象,并将HTTPS请求地址作为参数传递进去。最后,我们通过调用"newCall"方法来发起请求,并实现了回调函数,以处理请求响应数据。 需要注意的是,由于HTTPS请求需要验证服务器证书,我们需要在"OkHttpClient"的构造函数中添加一个"SSLSocketFactory"来验证证书。这个过程比较复杂,具体实现方法可以参考OkHttp官方文档。 这就是一个简单的OkHttp实现HTTPS请求的例子。通过使用OkHttp,我们可以快速、简便地实现HTTPS请求,并处理请求响应数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值