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 模仿vbs中的 DateAdd() 函数的代码
Aug 13 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
Mar 18 Javascript
js去字符串前后空格5种实现方法及比较
Apr 03 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
Sep 05 Javascript
微信小程序如何获取openid及用户信息
Jan 26 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
Apr 11 Javascript
Bootstrap Table列宽拖动的方法
Aug 15 Javascript
tsconfig.json配置详解
May 17 Javascript
VUE动态生成word的实现
Jul 26 Javascript
Element InputNumber计数器的使用方法
Jul 27 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
Nov 17 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
php入门小知识
2008/03/24 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
php实现计数器方法小结
2015/01/05 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
prototype 学习笔记整理
2009/07/17 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
开始着手第一个Django项目
2015/07/15 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
亿企通软件测试面试题
2012/04/10 面试题
简历中的自我评价怎么写
2014/01/29 职场文书
销售员岗位职责范本
2014/02/03 职场文书
给领导的检讨书
2014/02/16 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
债务纠纷委托书
2014/08/30 职场文书
高三英语教学计划
2015/01/23 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
Go 语言中 20 个占位符的整理
2021/10/16 Golang