IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 通用网络请求的封装 -> 正文阅读

[网络协议]通用网络请求的封装

在开发中一般都会用到网络请求,那有没有必要对网络请求进行封装呢?我觉得有必要

我就说说我使用网络请求的过程吧。算是一个编程思想的交流。如果和你的想法有不一致的,可以留言交流。

刚开始接触编程的时候,遇到网络请求,使用起来很直接,毕竟在自己的眼里只有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);
            }
        });

    }
}

打印结果:

图片

写在最后

我们在编程的过程中,肯定会遇到需求改变。那是不是要在开始时候就想到改变的情况呢?我觉得需要想一部分,毕竟不能全部的情况都会考虑进去。首先考虑一些大概率会修改的情况。哪怕出现没有想到的情况,当改变来到时,我们就根据不改变主体结构代码、最少改代码的想法去优化当前的代码。通过不断的优化,不断的思考,让代码更健壮。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:38:29  更:2021-11-29 16:39:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:04:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码