在开发中一般都会用到网络请求,那有没有必要对网络请求进行封装呢?我觉得有必要
我就说说我使用网络请求的过程吧。算是一个编程思想的交流。如果和你的想法有不一致的,可以留言交流。
刚开始接触编程的时候,遇到网络请求,使用起来很直接,毕竟在自己的眼里只有get请求啊,post请求啊。
01
作为编程萌新的我,哪里需要网络请求就在那里调用。
主要操作就是,自己写一个网络请求,在需要它的地方去调用。这样写有个很大的缺点:一旦你网络请求被修改或者被弃用,那你修改的地方就可能很多。
02
经过第一过程,我把我的网络请求或者一个第三方的网络请求框架封装起来,通过暴露接口去让调用者使用。
这样封装后,调用的时候只管调用封装类就好了,调用者不用管网络请求A
的任何修改,这一切都由A和B去承受。这时候,我们主要的逻辑代码不会做任何修改。
03
前两种方式,遇到网络请求修改的情况,修改的类比较多。特别是第一种,如果遇到改变,将会在调用者的内部修改。这样就是修改到了主要的逻辑代码,要是修改时,误操作到主要的逻辑代码,那自己的程序也发生了变化。
那有没有更优化的方式呢?
我的方案思路:
1、创建一个类持有网络请求(这和第二种工具类方式一致);
2、对外提供一个设置不同网络请求的接口;
1、怎么创建这个持有类
给持有类一个接口,规范它对外提供接口的数量。这个接口包括网络请求的各种请求方式。(实例中我只给get和post的方法)
规范请求接口:
public interface INetRequest {
/**
* get请求
* @param url 网络请求地址
* @param params 参数
* @param callBack 返回回调
*/
void get(String url, HashMap<String, Object> params, ICallBack callBack);
/**
* post 请求
* @param url 网络请求地址
* @param params 参数
* @param callBack 返回回调
*/
void post(String url, HashMap<String, Object> params, ICallBack callBack);
//还可以添加其他的请求方式,以及不同的参数请求,你自己就不用写这个otherFunction()
void otherFunction();
}
持有类的具体实现:
public class MyNetRequest implements INetRequest{
@Override
public void get(String url, HashMap<String, Object> params, ICallBack callBack) {
//这里处理网络请求的具体逻辑,我用new ICallBack模拟网络请求返回成功
ICallBack currentCallback = new ICallBack() {
@Override
public void error(String message) {
callBack.error(message);
}
@Override
public void succeed(String message) {
callBack.succeed(message);
}
@Override
public void failure(int code, String message) {
callBack.failure(code, message);
}
};
// 模拟处理返回成功,这里返回“get-MyNetRequest:请求成功啦”,规范的话,网络请求结果基本时json格式的数据
currentCallback.succeed("get-MyNetRequest:" + "请求成功啦");
}
@Override
public void post(String url, HashMap<String, Object> params, ICallBack callBack) {
//处理方式同get,这里就直接调用callBack的成功方法了
// 模拟处理返回成功,这里返回“get-MyNetRequest:请求成功啦”,规范的话,网络请求结果基本时json格式的数据
callBack.succeed("post-MyNetRequest:" + "请求成功啦");
}
@Override
public void otherFunction() {
}
}
2、当前请求类的实现
public class MyNetRequest implements INetRequest{
@Override
public void get(String url, HashMap<String, Object> params, ICallBack callBack) {
//这里处理网络请求的具体逻辑,我用new ICallBack模拟网络请求返回成功
ICallBack currentCallback = new ICallBack() {
@Override
public void error(String message) {
callBack.error(message);
}
@Override
public void succeed(String message) {
callBack.succeed(message);
}
@Override
public void failure(int code, String message) {
callBack.failure(code, message);
}
};
// 模拟处理返回成功,这里返回“get-MyNetRequest:请求成功啦”,规范的话,网络请求结果基本时json格式的数据
currentCallback.succeed("get-MyNetRequest:" + "请求成功啦");
}
@Override
public void post(String url, HashMap<String, Object> params, ICallBack callBack) {
//处理方式同get,这里就直接调用callBack的成功方法了
// 模拟处理返回成功,这里返回“get-MyNetRequest:请求成功啦”,规范的话,网络请求结果基本时json格式的数据
callBack.succeed("post-MyNetRequest:" + "请求成功啦");
}
@Override
public void otherFunction() {
}
}
3、 具体代码使用
使用时,我们对?NetRequestUtil?对象设置具体的请求类?MyNetRequest?,最后再需要网络请求时候调用get、post的方法就可以啦。
public class Client {
public static void main(String[] args) {
INetRequest myNetRequest = new MyNetRequest();
NetRequestUtil requestUtil = new NetRequestUtil(myNetRequest);
String url = "http://www.baidu.com";
HashMap<String, Object> params = new HashMap<>();
params.put("id",0);
params.put("name", "小杜");
requestUtil.get(url, params, new ICallBack() {
@Override
public void error(String message) {
System.out.println(message);
}
@Override
public void succeed(String message) {
System.out.println(message);
}
@Override
public void failure(int code, String message) {
System.out.println(message);
}
});
}
}
打印结果:
修改后的优点
结构图:
如果哪天,图中的网络请求类被弃用,那我们只用重新写一个新的网络请求,通过set,将工具类持有的请求类替换掉就行了。主要就不会对之前的类进行任何修改。
如果你领导告诉你,我觉得你之前的网络请求类1不错啊,你还是用之前的吧。这个时候你只需要改动一行代码就行了。向工具类set下你的网络请求类1就解决问题了。
需要替换的网络请求类:
public class OtherNetRequest implements INetRequest{
@Override
public void get(String url, HashMap<String, Object> params, ICallBack callBack) {
callBack.succeed("替换后的网络请求:get-MyNetRequest:" + "请求成功啦");
}
@Override
public void post(String url, HashMap<String, Object> params, ICallBack callBack) {
}
@Override
public void otherFunction() {
}
}
替换使用:
public class Client {
public static void main(String[] args) {
INetRequest myNetRequest = new MyNetRequest();
INetRequest otherNetRequest = new OtherNetRequest();
NetRequestUtil requestUtil = new NetRequestUtil(myNetRequest);
// 替换
requestUtil.setCurrentNetRequest(otherNetRequest);
String url = "http://www.baidu.com";
HashMap<String, Object> params = new HashMap<>();
params.put("id",0);
params.put("name", "小杜");
requestUtil.get(url, params, new ICallBack() {
@Override
public void error(String message) {
System.out.println(message);
}
@Override
public void succeed(String message) {
System.out.println(message);
}
@Override
public void failure(int code, String message) {
System.out.println(message);
}
});
}
}
打印结果:
写在最后
我们在编程的过程中,肯定会遇到需求改变。那是不是要在开始时候就想到改变的情况呢?我觉得需要想一部分,毕竟不能全部的情况都会考虑进去。首先考虑一些大概率会修改的情况。哪怕出现没有想到的情况,当改变来到时,我们就根据不改变主体结构代码、最少改代码的想法去优化当前的代码。通过不断的优化,不断的思考,让代码更健壮。
|