Angular网络请求的封装方法


Posted in Javascript onMay 22, 2018

很多时候,我很喜欢angular的编码风格,特别是angular支持typescript之后,完整的生命周期,完美的钩子函数,都是别的语言所无法替代的。

这里我来说说我自己的网络请求封装,某种意义上来说,angular自己的网络请求封装的很好的,我们没有必要再来画蛇添足,但是,可能是我有那么一点点的代码洁癖吧,喜欢自己的风格样式,所以就有了这一点多余的东西。

Angular的网络请求

这里是angular自己的网络请求。

  1. url代表网络请求地址,
  2. param网络请求参数
  3. 网络请求配置,例如:请求头等
this.http.post(url, param, config).subscribe(
   (res) => {
    //...请求成功
   }, (err) => {
    //...请求失败
   }, () => {
    //...请求完成
   }
  );

很多时候我觉得,每一次请求都要写上subscribe里面的那些参数,很麻烦,或者说看起来觉得不喜欢,所以,我一般给自己封装一个新的服务service。同时给每一个需要做网络请求的组件component实现一个新的接口interface,这里面有很多都是源自java语言的设计思想。

一个网络接口

这里创建一个网络接口,来完成网络请求的回调。

export interface OnHttpImp {

 onResult(result: HttpResult, code?: number): void;

 onError?(err:any): void;

 onComplete?(): void;
}

export class HttpResult {
 code?: number;
 data?: any;
 msg?: string;
}

OnHttpImp 接口创建三个方法,分别是onResult,onError和onComplete,其中onComplete和onError是非必需实现的,onResult是必须实现的。这里的三个函数用来完成http的三个回调。

那么,上面的网络请求就可以移到新的服务CommonService里面,就会变成这样:

public post(url: string, param: FormData, callback: OnHttpImp, code?: number) {
  url = Config.base + url;
  const headers = new Headers();
  headers.append('Content-Type', 'application/x-www-form-urlencoded');
  this.http.post(url, param, {}).subscribe(
   (res) => {
    if (code) {
     callback.onResult(res, code);
    } else {
     callback.onResult(res);
    }
   }, (err) => {
    console.log(url + '===>' + JSON.stringify(err));
   }, () => {
    if (callback.onComplete) {
     callback.onComplete();
    }
   }
  );
 }

这里面的url和param就不用多解释了,callback就是一个OnHttpImp的实例,作用就是把网络请求返回的数据回调到对应的component里面,这样就可以是数据处理和网络请求相互分开。code是一个标识符,用来区分在一个组件里面发送多个请求时,实现数据的隔离。

HttpResult是一个网络请求返回数据的类,用来方便处理数据,可以适当根据自己的数据返回类型进行自定义封装。

调用的组件

先看代码:

export class LoginComponent implements OnInit, OnHttpImp {
 public validateForm: FormGroup;
 public username_control: AbstractControl;
 public password_control: AbstractControl;

 constructor(private fb: FormBuilder,
       private http: HttpUtil) {
 }

 ngOnInit() {
  this.validateForm = this.fb.group({
   'userName': [null, [Validators.required]],
   'password': [null, [Validators.required]],
   remember: [true],
  });
  this.username_control = this.validateForm.controls['userName'];
  this.password_control = this.validateForm.controls['password'];
 }


 _submitForm() {
  const params = new FormData();
  const md5 = new Md5();
  const password = md5.appendStr(this.password_control.value).end();
  params.set('username', this.username_control.value);
  params.set('password', password.toString());
  this.http.post('/user/login', params, this);
 }

 onResult(result: HttpResult, code?: number): void {
  //如果多个网络请求,需要传入code值,根据code值来判断请求来源
  //swthch(code){
  //  case 100:
  //  
  //  break;
  //}
  
  // 如果单个请求,直接处理请求结果。
  // console.log(result)
  
 }
}

上面的htpp请求传输的OnHttpImp对象是this,那么就说明LoginComponnt组件必须实现OnHttpImp接口,然后实现里面的函数onResult,onError和onComplete.

这样处理,就可以将http请求和,数据处理分开了,代码的可读性和简洁性都有大大的提升。

进一步的封装方式

  1. 可以把上述里面component里面调用网络请求时传入的this,用一个统一的类MCallback来替代,统一处理返回的数据。
  2. 可以把所有的网络请求统一放到一个服务里面,通过调用方法名来请求,这样可以实现多次网络请求的耦合,但是个人觉得有点过度封装了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript之appendChild、insertBefore和insertAfter使用说明
Dec 30 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
Mar 19 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 Javascript
EasyUI加载完Html内容样式渲染完成后显示
Jul 25 Javascript
jQuery、zepto、js常用小技巧
Feb 12 Javascript
JavaScript实现简单评论功能
Aug 17 Javascript
JS正则表达式完美实现身份证校验功能
Oct 18 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
Jan 22 Javascript
脚手架vue-cli工程webpack的基本用法详解
Sep 29 Javascript
JS数组方法join()用法实例分析
Jan 18 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
Jan 26 Javascript
微信小程序picker组件两列关联使用方式
Oct 27 Javascript
vue input输入框模糊查询的示例代码
May 22 #Javascript
vue 中swiper的使用教程
May 22 #Javascript
vue配置多页面的实现方法
May 22 #Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
May 22 #Javascript
详解js类型判断
May 22 #Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
May 22 #Javascript
swiper 自动图片无限轮播实现代码
May 21 #Javascript
You might like
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
CI框架常用函数封装实例
2016/11/21 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
JavaScript事件 "事件对象"的注意要点
2016/01/14 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python获取当前时间的方法
2014/01/14 Python
Python解决鸡兔同笼问题的方法
2014/12/20 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
python学习基础之循环import及import过程
2018/04/22 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
Python实现一个论文下载器的过程
2021/01/18 Python
详解pandas映射与数据转换
2021/01/22 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
综艺节目策划方案
2014/06/13 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
英文投诉信格式
2015/07/03 职场文书
SpringBoot快速入门详解
2021/07/21 Java/Android