Angular网络请求的封装方法
很多时候,我很喜欢angular的编码风格,特别是angular支持typescript之后,完整的生命周期,完美的钩子函数,都是别的语言所无法替代的。
这里我来说说我自己的网络请求封装,某种意义上来说,angular自己的网络请求封装的很好的,我们没有必要再来画蛇添足,但是,可能是我有那么一点点的代码洁癖吧,喜欢自己的风格样式,所以就有了这一点多余的东西。
Angular的网络请求
这里是angular自己的网络请求。
- url代表网络请求地址,
- param网络请求参数
- 网络请求配置,例如:请求头等
this.http.post(url,param,config).subscribe( (res)=>{ //...请求成功 },(err)=>{ //...请求失败 },()=>{ //...请求完成 } );
很多时候我觉得,每一次请求都要写上subscribe里面的那些参数,很麻烦,或者说看起来觉得不喜欢,所以,我一般给自己封装一个新的服务service。同时给每一个需要做网络请求的组件component实现一个新的接口interface,这里面有很多都是源自java语言的设计思想。
一个网络接口
这里创建一个网络接口,来完成网络请求的回调。
exportinterfaceOnHttpImp{ onResult(result:HttpResult,code?:number):void; onError?(err:any):void; onComplete?():void; } exportclassHttpResult{ code?:number; data?:any; msg?:string; }
OnHttpImp接口创建三个方法,分别是onResult,onError和onComplete,其中onComplete和onError是非必需实现的,onResult是必须实现的。这里的三个函数用来完成http的三个回调。
那么,上面的网络请求就可以移到新的服务CommonService里面,就会变成这样:
publicpost(url:string,param:FormData,callback:OnHttpImp,code?:number){ url=Config.base+url; constheaders=newHeaders(); 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是一个网络请求返回数据的类,用来方便处理数据,可以适当根据自己的数据返回类型进行自定义封装。
调用的组件
先看代码:
exportclassLoginComponentimplementsOnInit,OnHttpImp{ publicvalidateForm:FormGroup; publicusername_control:AbstractControl; publicpassword_control:AbstractControl; constructor(privatefb:FormBuilder, privatehttp: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(){ constparams=newFormData(); constmd5=newMd5(); constpassword=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){ //case100: // //break; //} //如果单个请求,直接处理请求结果。 //console.log(result) } }
上面的htpp请求传输的OnHttpImp对象是this,那么就说明LoginComponnt组件必须实现OnHttpImp接口,然后实现里面的函数onResult,onError和onComplete.
这样处理,就可以将http请求和,数据处理分开了,代码的可读性和简洁性都有大大的提升。
进一步的封装方式
- 可以把上述里面component里面调用网络请求时传入的this,用一个统一的类MCallback来替代,统一处理返回的数据。
- 可以把所有的网络请求统一放到一个服务里面,通过调用方法名来请求,这样可以实现多次网络请求的耦合,但是个人觉得有点过度封装了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。