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 相关文章推荐
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
Apr 21 Javascript
js调用flash的效果代码
Apr 26 Javascript
取选中的radio的值
Jan 11 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
Jan 08 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
Jan 13 Javascript
Jquery中Event对象属性小结
Feb 27 Javascript
jQuery原生的动画效果
Jul 10 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
JS获取年月日时分秒的方法分析
Nov 28 Javascript
input type=file 选择图片并且实现预览效果的实例
Oct 26 Javascript
在vue中高德地图引入和轨迹的绘制的实现
Oct 11 Javascript
JS实现网页端猜数字小游戏
Mar 06 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网上调查系统
2006/10/09 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
php如何获取文件的扩展名
2015/10/28 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
根据当前时间在jsp页面上显示上午或下午
2014/08/18 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
Windows下安装python2.7及科学计算套装
2015/03/05 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
解决Django中多条件查询的问题
2019/07/18 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
法院干警四风问题自我剖析材料
2014/09/29 职场文书
爱心捐款感谢信
2015/01/20 职场文书
教师节简报
2015/07/20 职场文书
业务员管理制度范本
2015/08/06 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
导游词之吉林花园山
2019/10/17 职场文书