视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Angular网络请求的封装方法
2020-11-27 22:14:09 责编:小采
文档

很多时候,我很喜欢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. 可以把所有的网络请求统一放到一个服务里面,通过调用方法名来请求,这样可以实现多次网络请求的耦合,但是个人觉得有点过度封装了。

下载本文
显示全文
专题