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 相关文章推荐
extjs 学习笔记 四 带分页的grid
Oct 20 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
Oct 11 Javascript
js数组循环遍历数组内所有元素的方法
Jan 18 Javascript
深入分析Cookie的安全性问题
Mar 01 Javascript
大型JavaScript应用程序架构设计模式
Jun 29 Javascript
基于Javascript实现文件实时加载进度的方法
Oct 12 Javascript
原生JS轮播图插件
Feb 09 Javascript
利用node.js搭建简单web服务器的方法教程
Feb 20 Javascript
jQuery中layer分页器的使用
Mar 13 Javascript
JS实现非首屏图片延迟加载的示例
Jan 06 Javascript
小程序的上传文件接口的注意要点解析
Sep 17 Javascript
vue实现登陆页面开发实践
May 30 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
JavaScript 私有成员分析
2009/01/13 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
微信小程序左右滑动切换页面详解及实例代码
2017/02/28 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
2020/07/01 Python
python lambda的使用详解
2021/02/26 Python
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
Linux中如何用命令创建目录
2015/01/12 面试题
大专学生推荐信范文
2013/11/19 职场文书
校园报刊亭的创业计划书
2014/01/02 职场文书
高二历史教学反思
2014/01/25 职场文书
个人银行贷款担保书
2014/04/01 职场文书
新兵入伍心得体会
2014/09/04 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
财务部会计岗位职责
2015/02/03 职场文书
2015年入党决心书
2015/02/05 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python
JavaScript数组 几个常用方法总结
2021/11/11 Javascript
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL