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 相关文章推荐
Javascript 两个窗体之间传值实现代码
Sep 25 Javascript
原生js实现跨浏览器获取鼠标按键的值
Apr 08 Javascript
jQuery对下拉框,单选框,多选框的操作
Feb 21 Javascript
jQuery实现带动画效果的二级下拉导航方法
Mar 11 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
Aug 01 Javascript
jQuery特殊符号转义的实现
Nov 30 Javascript
使用ionic播放轮询广告的实现方法(必看)
Apr 24 Javascript
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
理解Koa2中的async&await的用法
Feb 05 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
Jun 26 Javascript
在vue中获取wangeditor的html和text的操作
Oct 23 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
Dec 04 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实现监控varnish缓存服务器的状态
2014/12/30 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
推荐下python/ironpython:从入门到精通
2007/10/02 Python
使用python实现baidu hi自动登录的代码
2013/02/10 Python
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
Django URL传递参数的方法总结
2016/08/28 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
基于python的字节编译详解
2017/09/20 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
python开发前景如何
2020/06/11 Python
python调用百度API实现人脸识别
2020/11/17 Python
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
董事长秘书职责
2014/01/31 职场文书
寄语学生的话
2014/04/10 职场文书
房屋转让协议书范本
2014/04/11 职场文书
教师师德考核自我评价
2014/09/13 职场文书
庆元旦演讲稿
2014/09/15 职场文书
2014年实验室工作总结
2014/12/03 职场文书
2015年行政部工作总结
2015/04/28 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL