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 相关文章推荐
Array对象方法参考
Oct 03 Javascript
js 判断checkbox是否选中的操作方法
Nov 09 Javascript
js获取当前路径的简单示例代码
Jan 08 Javascript
JS实现网页滚动条感应鼠标变色的方法
Feb 26 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
Aug 23 Javascript
浅析vue component 组件使用
Mar 06 Javascript
详解vue模拟加载更多功能(数据追加)
Jun 23 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
Vue 组件注册实例详解
Feb 23 Javascript
jQuery编写QQ简易聊天框
Aug 27 jQuery
Ant Design的可编辑Tree的实现操作
Oct 31 Javascript
解决vue-router的beforeRouteUpdate不能触发
Apr 14 Vue.js
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
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
PHP答题类应用接口实例
2015/02/09 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
PHP7 mongoDB扩展使用的方法分享
2019/05/02 PHP
php use和include区别总结
2019/10/13 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
深入Python解释器理解Python中的字节码
2015/04/01 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
python fabric实现远程部署
2017/01/05 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
python查看列的唯一值方法
2018/07/17 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
python 实现"神经衰弱"翻牌游戏
2020/11/09 Python
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
博朗(Braun)俄罗斯官方商店:德国小家电品牌
2019/09/24 全球购物
华为的Java面试题
2014/03/07 面试题
关于递归的一道.NET面试题
2013/05/12 面试题
3个CCIE对一个工程师的面试题
2012/05/06 面试题
实习教师个人的自我评价
2013/11/08 职场文书
安全生产标语大全
2014/10/06 职场文书
先进班集体事迹材料
2014/12/25 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python