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 相关文章推荐
jQuery autocomplate 自扩展插件、自动完成示例代码
Mar 28 Javascript
jquery应该如何来设置改变按钮input的onclick事件
Dec 10 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
JS对select控件option选项的增删改查示例代码
Oct 21 Javascript
轻量级的原生js日历插件calendar.js使用指南
Apr 28 Javascript
javascript基本算法汇总
Mar 09 Javascript
微信QQ的二维码登录原理js代码解析
Jun 23 Javascript
JavaScript排序算法动画演示效果的实现方法
Oct 18 Javascript
Bootstrap表单控件使用方法详解
Jan 11 Javascript
vue favicon设置以及动态修改favicon的方法
Dec 21 Javascript
react实现同页面三级跳转路由布局
Sep 26 Javascript
WebStorm中如何将自己的代码上传到github示例详解
Oct 28 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调用Java对象的方法
2006/10/09 PHP
五个PHP程序员工具
2008/05/26 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
Vue3.x源码调试的实现方法
2019/10/13 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python操作MongoDB详解及实例
2017/05/18 Python
Flask数据库迁移简单介绍
2017/10/24 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
Python----数据预处理代码实例
2019/03/20 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
python线程里哪种模块比较适合
2020/08/02 Python
python的数学算法函数及公式用法
2020/11/18 Python
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
环境工程大学生个人的自我评价
2013/10/08 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
任命书怎么写
2014/06/04 职场文书
2014年班级工作总结
2014/11/14 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
边城读书笔记
2015/06/29 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
python代码实现扫码关注公众号登录的实战
2021/11/01 Python