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 相关文章推荐
js 编写规范
Mar 03 Javascript
理解Javascript_14_函数形式参数与arguments
Oct 20 Javascript
根据选择不同的下拉值出现相对应的文本输入框
Aug 01 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
Aug 26 Javascript
jquery获取及设置outerhtml的方法
Mar 09 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
Mar 16 Javascript
AngularJS入门之动画
Jul 27 Javascript
JavaScript类的写法
Sep 17 Javascript
webpack 1.x升级过程中的踩坑总结大全
Aug 09 Javascript
解决vue页面刷新或者后退参数丢失的问题
Mar 13 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
Dec 16 Javascript
layui 地区三级联动 form select 渲染的实例
Sep 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
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
基于JQuery的密码强度验证代码
2010/03/01 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
概述BootStrap中role="form"及role作用角色
2016/12/08 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
Python中的sort()方法使用基础教程
2017/01/08 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
django的登录注册系统的示例代码
2018/05/14 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
Python lambda表达式用法实例分析
2018/12/25 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
Python安装Bs4的多种方法
2020/11/28 Python
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
学习经验交流会主持词
2014/04/01 职场文书
学校班班通实施方案
2014/06/11 职场文书
政府采购方案
2014/06/12 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
Redis 哨兵集群的实现
2021/06/18 Redis
MySQL分区路径子分区再分区
2022/04/13 MySQL