Android网络框架之okhttp封装——上篇

Android网络框架之okhttp封装——上篇

排版不佳建议点击查看原文

问题提出

众所周知Android系统提供HttpURLConnection来实现网络请求,当然我们并不是只能使用HttpURLConnection,完全没有任何其他选择,事实上在开源盛行的今天,有许多出色的网络通信库都可以替代原生的HttpURLConnection,而其中OkHttp无疑是做得最出色的一个。

OkHttp的基本用法相信你早已了解,我们再来回顾一下:

《Android网络框架之okhttp封装——上篇》

我们只是完成了一个最基本的Get请求居然用了这么多行代码,还创建了三个对象,实际开发中网络请求很常用,这会造成代码重复,所以okhttp还不能直接满足我们的要求,我们需要对okhttp进行封装。

封装思路

《Android网络框架之okhttp封装——上篇》

首先我们发送一个请求总共分为三部分:

1.request部分,并没有什么实际作用,我们可以在最终的build方法执行之前连缀很多其他方法来丰富这个request。

2.oKhttp部分,因为我们用到okhttp所以对OkHttpClient需要有相关参数设置。

3.callBack部分,我们请求回来以后需要处理的逻辑。

Request封装

首先,我们发现我们在请求的过程中往往会携带许多的请求参数,所以我们对请求参数先进行封装:

《Android网络框架之okhttp封装——上篇》

我们创建了RequestParams类对请求的参数进行封装。首先我们新建了线程安全的HashMap,在构造函数中我们接收一个Map,作为我们ConcurrentHashMap的数据源。

《Android网络框架之okhttp封装——上篇》

紧接着我们对构造函数进行了两次重载,应对没有请求参数的情况、应对单一参数的情况。还创建了hashParams方法判断是否含有请求参数。

完成了对请求参数的封装以后,我们需要对常见请求进行封装:

《Android网络框架之okhttp封装——上篇》

我们新建了CommonRequest类,该类的职责是根据URL与请求参数,给我们生成okhttp中的Request对象。我们在onPostRequest方法中完成了Post请求,首先我们构建出FormBody对象,存放待提交的参数,然后我们构建了Headers用来存放请求头的参数,最终调用Request.Builder中的Post方法把我们的FormBody与Headers对象传入完成Request对象的创建。

《Android网络框架之okhttp封装——上篇》

接下来自然是Get请求,完成Get请求要比Post请求简单,主要是对URL的请求参数做拼接字符串,总体流程与Post请求类似,同样完成Request对象的创建。

OkhttpClient封装

根据我们上面提到的封装思路,我们已经完成了Request封装,接下来我们需要对OkhttpClient进行封装:

《Android网络框架之okhttp封装——上篇》

我们创建了CommonOkhttpClient类,此类的职责是用来发送get,post请求的工具类,包括设置一些请求的公共参数。

首先我们设置请求超时为30,在静态字段中我们初始化了OkhttpClient的请求超时时间,以及允许重定向(可能你会问什么是重定向:由于我们客户端发送的请求在服务器端可能会被转发,以此灵活配置,所有我们默认开启重定向)最后通过build方法生成OkhttpClient对象。

获取了OkhttpClient对象以后我们开始发送请求,创建了sendRequest方法接收我们事先得到的Request对象和Callback,方法内新建了Call对象,并调用它的execute方法请求并获取服务器返回的数据。

结果

《Android网络框架之okhttp封装——上篇》

我们可以直接调用刚刚创建的CommonOkhttpClient类的sendRequest方法,方法需要Request对象和Callback,那还不简单,我们都封装好了,直接调用CommonRequest类的静态方法initGetRequest(无请求头)它会根据我们的url与封装好的请求参数(这里我们没有请求参数传null)给我们返回一个Request对象。完成一次Get请求。

结果发现代码并没有少多少,难道我们白费心机了吗?当然不是,因为我们还没有对回调Callback进行封装。也许你还发现我们的okhttp的封装并不支持https,因为这部分很有必要以后单独聊聊。

欢迎长按下图-识别图中二维码或者扫一扫关注我的公众号:

《Android网络框架之okhttp封装——上篇》

如果你有不同意见或建议或者有好的技术文章想和大家分享欢迎投稿,可以把你的文章使用附件的形式发送到我的邮箱2908116133@qq.com

谢谢阅读!

    原文作者:君华_Joshua
    原文地址: https://www.jianshu.com/p/5e650341ab2c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞