用于安卓系统的网络请求代理工具及代理方法
技术领域
本发明涉及安卓应用开发领域,具体涉及一种用于安卓系统的网络请求代理工具及代理方法。
背景技术
目前安卓系统上有非常多的网络请求工具,如Apache推出的HttpClient、谷歌官方推出的Volley以及Github上的开源工具Ion、AsyncHttp、Okhttp等。
每种网络请求工具的接口都不同,调用代码也不尽相同。例如,若需要加载一个url的数据(http://www.baidu.com),
使用Ion时,其流程为:
Ion工具使用了FutureCallback作为结果通知回调,在FutureCallback里拿到网络请求结果;
使用Okhttp时,其流程为:
Okhttp工具使用了Callback作为结果通知回调,在Callback里捕获失败消息并拿到网络请求结果
从上述可以看到,不同的网络请求工具对于同一个网络url,如何发起请求、如何接受返回结果,操作逻辑和代码流程完全不一样。在应用程序中,每一处发起网络请求的代码都要按这种方式处理,代码量相当繁琐。
开发者在开发一款具有网络功能的应用程序时,往往会在一开始便选定一款网络请求工具,比如Ion。但在后期开发过程中,如果发现选定的网络请求工具不能达到预期效果,比如根据需要,要求应用程序使用https加密协议替代http,但已经选定的网络请求工具Ion对https协议支持度不及另一款网络请求工具Okhttp。此时,如果要把已经开发了一半的应用程序中的Ion替换成Okhttp,开发者将面临如下几个问题:
1.代码繁琐量
程序中往往会有几十上百处网络请求,每一处都需要手动替换,从上述Ion代码替换为OkHttp代码,这样的操作繁琐复杂,需要变动的代码量极其庞大
2.代码稳定性
两种不同的网络请求工具,逻辑原理和流程是各不相同的,每替换一处代码,还必须再经过一次测试,确保替换后新的网络请求工具的代码效果与原代码完全一致。在大批量代码替换时非常容易遗漏测试。
同样,如果现在从Ion替换成了Okhttp,假如未来Okhttp的功能不能满足要求,整个应用程序的网络请求工具及相关代码,还将面临再次替换的情况,极大的增加了工作量,影响了开发应用程序的整体效率。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种可大幅减少代码替换工作量,提高开发效率的用于安卓系统的网络请求代理工具。
为达到以上目的,本发明采取的技术方案是:
一种用于安卓系统的网络请求代理工具,包括:
请求构造模块,其内设有多个数据集,所述数据集用于存储发起网络请求所需的全部参数,所述请求构造模块还设有多个构造函数,所述构造函数根据发起网络请求的方式,将对应的所需要的参数加入到数据集中,构建请求构造器;
请求执行模块,其内设有多个请求执行器抽象函数,所述请求执行模块用于根据所述请求执行器抽象函数,对网络请求工具进行封装,得到使参数与该网络请求工具相分离的请求执行器,所述请求执行器根据请求构造器中的参数,发起网络请求;以及
请求结果回调模块,其用于统一每个网络请求工具的内部通知回调的方式。
在上述技术方案的基础上,所述请求构造模块包括请求头参数数据集、网址传参数据集、表单传参数据集和多部件传参数据集,所述参数为请求头参数、网址传参、表单传参和多部件传参。
在上述技术方案的基础上,所述构造函数为addHeader函数、addQuery函数、addBody函数和addMultiPart函数。
在上述技术方案的基础上,所述请求执行器抽象函数包括request函数、callback函数和execute函数。
在上述技术方案的基础上,所述请求结果回调模块建立的通知回调的方式为onSuccess回调和onFailure回调。
与此同时,本发明还提供一种可大幅减少代码替换工作量,提高开发效率的代理方法。
为达到以上目的,本发明采取的技术方案是:
一种利用上述网络请求代理工具的代理方法,该方法包括以下步骤:
根据请求构造模块内的数据集、构造函数和发起网络请求的方式,构建请求构造器;
请求执行模块根据请求执行器抽象函数,对网络请求工具进行封装,得到使参数与该网络请求工具相分离的请求执行器;
请求执行器根据请求构造器内的参数,发起网络请求;
请求结果回调模块统一每个网络请求工具的内部通知回调的方式,来接收请求执行器的返回结果;以及
判断是否需要替换网络请求工具,若否,则继续使用现有的请求执行器发起网络请求,若是,则利用请求执行模块对新替换的网络请求工具进行封装,得到新的请求执行器,并利用新的请求执行器发起网络请求。
在上述技术方案的基础上,根据发起网络请求的方式,确定该方式所需要的参数,调用构造函数,将所需要的参数加入到数据集中,构建请求构造器。
在上述技术方案的基础上,所述请求构造模块包括请求头参数数据集、网址传参数据集、表单传参数据集和多部件传参数据集,所述构造函数为addHeader函数、addQuery函数、addBody函数和addMultiPart函数。
在上述技术方案的基础上,请求结果回调模块将各个网络请求工具接收请求执行器的返回结果的方式统一为onSuccess回调和onFailure回调。
在上述技术方案的基础上,所述请求执行模块根据request函数、callback函数、execute函数对网络请求工具进行封装。
与现有技术相比,本发明的优点在于:
本发明的网络请求代理工具包括请求构造模块、请求执行模块和请求结果回调模块,请求构造模块用于构建请求构造器,请求构造器用来储存与网络工具实现方法无关系的、原始的网络请求数据。请求执行器使用请求构造器中的数据,真正发起网络请求。其中请求执行器不需要管请求构造器中的数据代表什么意义,只需要负责执行,与网络请求参数解耦即可。请求结果回调模块用来接收请求执行器的返回结果,并反馈给开发者,同样,请求结果回调模块也不需要管返回结果代表什么意义,只需要反馈结果与网络请求参数和网络工具解耦即可。即本发明的网络请求代理工具,无论使用什么网络请求工具,只需要修改网络请求代理工具中请求执行器内部的实现代码,参数格式和结果回调代码完全不需要改变,即可完成代码的替换工作。相比现有的方式,其工作量大幅减小,提高了开发效率。
附图说明
图1为本发明实施例中代理方法的流程图;
图2为本发明实施例中网络请求代理工具的结构框图;
图3为现有技术中发起网络请求方式;
图4为本网络请求代理工具发起网络请求方式。
具体实施方式
以下结合附图及实施例对本发明作进一步详细说明。
参见图1所示,本发明实施例提供一种在需要更换网络请求工具的情况下,能大幅减少代码替换的工作量,提高开发效率的代理方法,该方法包括以下步骤:
S1.根据请求构造模块内的数据集、构造函数和发起网络请求的方式,构建请求构造器。
请求构造模块相当于一个容器,开发者将发起一个网络请求所需的所有参数装入其中,成为一个与网络工具无关的原始数据。
本实施例中的请求构造器内部有四个数据集,分别为:请求头参数数据集、网址传参数据集、表单传参数据集和多部件传参数据集。这四个数据集对应的用来储存请求头参数、网址传参、表单传参和多部件传参。请求构造模块内的构造函数为addHeader函数、addQuery函数、addBody函数和addMultiPart函数。当代码中调用addHeader函数时,请求头参数会被加入请求头参数数据集。当代码中调用addQuery函数时,网址传参数据会被加入网址传参数据集。当代码中调用addBody函数时,表单传参数据会被加入表单传参数据集。当代码中调用addMultiPart函数时,多部件传参数据会被加入多部件传参数据集。
目前发起网络请求的方式通常分为GET请求和POST请求两大类,如:http://www.baidu.com/s?wd=android,表示的是GET请求,其地址为http://www.baidu.com/,路径为s,网址传参为wd=android。
POST请求是在GET请求的基础上,在内部提交了一套表单数据,该表单数据不显示在url地址上。假设在百度上登录,用户名是abc,密码为123,则网络请求工具会在内部发送一套表单传参username=abc&password=123。
针对上述GET请求,可以调用如下代码构建一个请求构造器:
RequestBuilder requestBuilder=new RequestBuilder("baidu")
.setUrl("http://www.baidu.com/","s")
.addQuery("wd","android");
针对上述POST请求,可以调用如下代码构建一个请求构造器:
在构建了请求构造器后,即可将其用来储存与网络请求工具实现方法无关系的、原始的网络请求数据。
S2.请求执行模块根据请求构造器内的参数和请求执行器抽象函数,对网络请求工具进行封装,得到使参数与该网络请求工具相分离的请求执行器。
请求执行模块是一个代理接口,针对不同的网络请求工具做出不同的实现代码。
本实施例中的请求执行模块有三个重要的抽象函数:request(请求)函数、callback(结果通知)函数和execute(执行)函数;即
开发者只需要用请求执行模块,针对不同网络请求工具做一次封装即可。如,使用请求执行模块封装Ion工具:
经过封装后,便可以得到一个参数与网络请求工具分离的请求执行器MyRequestExecutor。按照以往设计思路,应用程序中每一处网络调用的地方都要直接写Ion.with(context).....这样的代码,网络请求的参数与网络请求工具强关联,如果要替换网络请求工具,那么所有地方都要替换掉。
而如果使用本方法,网络调用的地方将变为诸如:
从而可知这样写的代码与实际使用的网络工具没有直接关系。
如果要替换网络请求工具,开发者只需要利用请求执行模块将新的网络请求工具库封装代理即可,整个应用程序中几十上百处,甚至更多处网络请求代码将立刻享受新网络请求工具的特性。
具体的,开发者在一开始花费一定时间,用请求执行模块封装了Ion工具,形成一个请求执行器MyRequestExecutor后,后续所有网络请求只需要通过MyRequestExecutor即可。
如果不这么封装,假设App里有100条网络请求代码,用Ion工具,例举出来,具体如下:
Ion.with(context).load(“http://www.baidu.com/1”)……
Ion.with(context).load(“http://www.baidu.com/2”)……
Ion.with(context).load(“http://www.baidu.com/3”)……
……
Ion.with(context).load(“http://www.baidu.com/100”)……
若后来发现Ion工具不合适,要替换成OkHttp工具,列举出来,具体如下:
new OkHttpClient().newCall(“http://www.baidu.com/1”)……
new OkHttpClient().newCall(“http://www.baidu.com/2”)……
new OkHttpClient().newCall(“http://www.baidu.com/3”)……
……
new OkHttpClient().newCall(“http://www.baidu.com/100”)……
从上面可以看出,若按照传统的方式,在替换网络请求工具后,将要替换100处代码,其工作量极其繁琐。
而采用本实施例中的代理方法,首先利用请求执行模块把Ion工具封装成MyRequestExecutor:
new MyRequestExecutor().request(“http://www.baidu.com/1”)……
new MyRequestExecutor().request(“http://www.baidu.com/2”)……
new MyRequestExecutor().request(“http://www.baidu.com/3”)……
……
newMyRequestExecutor().request(“http://www.baidu.com/100”)…
后续开发工作中若发现Ion不合适,要替换成OkHttp,只需要把OkHttp封装成MyRequestExecutor替换掉原来的MyRequestExecutor:
new MyRequestExecutor().request(“http://www.baidu.com/1”)……
new MyRequestExecutor().request(“http://www.baidu.com/2”)……
new MyRequestExecutor().request(“http://www.baidu.com/3”)……
……
newMyRequestExecutor().request(“http://www.baidu.com/100”)…
可以发现,发起网络请求的100条代码完全不用变化,开发者只需要把MyRequestExecutor这个工具的内部实现逻辑从Ion改成OkHttp就行,即只需要进行一处替换即可,相比传统方式要进行100处替换,极大地减少了代码替换的工作量,提高了开发的效率。
S3.请求执行器根据请求构造器内的参数,发起网络请求。
和传统方式相比,本实施例中实际上发起请求的是请求执行器。
S4.请求结果回调模块统一每个网络请求工具的内部通知回调的方式,来接收请求执行器的返回结果。
请求结果回调模块是一个代理接口,有两个抽象函数onSuccess和onFailure
开发者使用该接口配合请求执行器,即可以统一代码中风格和流程,不论所使用的网络工具内部的结果通知回调如何(如,Ion的FutureCallback回调中只有一个onCompleted,而Okhttp的Callback回调中却有两个onFailure和onResponse),在应用程序代码中只需要关心这个代理的接口中onSuccess和onFailure回调即可。这样便解决了不同网络请求工具接受返回结果方式不统一的问题。
S5.判断是否需要替换网络请求工具,若否,执行步骤S6,若是执行步骤S7。
S6.继续使用现有的请求执行器发起网络请求。
S7.利用请求执行模块对新替换的网络请求工具进行封装,得到新的请求执行器,并利用新的请求执行器发起网络请求。
S8.判断全部网络请求是否完成,若否,回到步骤S5,若是,结束。
参见图2所示,本发明还提供一种实现上述代理方法的网络请求代理工具,包括:
请求构造模块,其内设有多个数据集,数据集用于存储发起网络请求所需的全部参数,请求构造模块还设有多个构造函数,构造函数根据发起网络请求的方式,将对应的所需要的参数加入到数据集中,构建请求构造器。
请求执行模块,其内设有多个请求执行器抽象函数,请求执行模块用于根据请求执行器抽象函数,对网络请求工具进行封装,得到使参数与该网络请求工具相分离的请求执行器,请求执行器根据请求构造器中的参数,发起网络请求。
请求结果回调模块,其用于统一每个网络请求工具的内部通知回调的方式。
本网络请求代理工具中,请求构造器用来储存与网络工具实现方法无关系的、原始的网络请求数据,如url、请求头、传参等。请求执行器使用请求构造器中的数据,真正发起网络请求。其中请求执行器不需要管请求构造器中的数据代表什么意义,只需要负责执行,与网络请求参数解耦即可。请求结果回调模块用来接收请求执行器的返回结果,并反馈给开发者,同样,请求结果回调模块也不需要管返回结果代表什么意义,只需要反馈结果与网络请求参数和网络工具解耦即可。
现有技术对比图3和图4可以进一步了解现有技术与本网络请求代理工具之间的区别。参见图3所示,图3是现有发起网络请求方式,现有的技术中每一条网络请求,参数、网络请求工具和结果回调都是强关联的,发起网络请求的代码格式与网络请求工具绑定,若要替换网络请求工具,参数格式和结果回调都要跟着网络请求工具一起替换和修改,工作量巨大。
参见图4所示,图4是本网络请求代理工具发起网络请求方式,无论使用什么网络请求工具,只需要修改网络请求代理工具中请求执行器MyRequestExecutor内部的实现代码,参数格式和结果回调代码完全不需要改变,即可完成代码的替换工作。相比现有的方式,其工作量大幅减小。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。