亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳解封裝基礎的angular4的request請求方法

2019-11-19 13:42:55
字體:
來源:轉載
供稿:網友

為什么要封裝呢?

angular4自身提供的請求方法是用Observable來實現的。用的是觀察者模式,個人認為這用來寫請求是非常方便的。

一個項目里會有非常多的不同的請求,但是其實每個請求都會有些共性。比如:每個請求都要傳Authorization,比如每個請求都要先判斷后臺返回的status字段為200時才是請求成功,后臺正真返回的數據在data字段里,比如對于錯誤信息的處理都是一樣的......等等。

所以我們需要封裝出一個請求,去統一處理這些問題,從而保證組件里調用請求方法的時候收到的值都是可以直接拿來用的,幾乎不用再寫些重復的代碼。

希望封裝成什么樣呢?

當然是越少重復的代碼越好,我們就是想偷懶!?。?

怎么實現呢?

首先先新建一個請求的service,文件名為:request.service.ts。然后跟著我來虛擬需求,一步一步的慢慢來完善這個service。

需求A

1.請求方式為get。

2.默認的請求超時時間為3秒,可傳入別的超時時間。

3.后臺返回的成功的json為這樣:

{  "status": 200,  "data"  : ...}

錯誤時這樣:

{  "status": 201,  "msg"  : "用戶名或密碼錯誤"}

實現A

request.service.ts

/** ******************************************************************************************** * @App: test * @author: isiico * @type: service * @src: services/request.service.ts * * @descriptions: * 請求的服務 * ******************************************************************************************** */// Angular Coreimport {Injectable} from '@angular/core';import {HttpClient} from '@angular/common/http';// rxjsimport {Observable} from 'rxjs/Observable';import 'rxjs/add/operator/map';import 'rxjs/add/operator/timeout';import 'rxjs/add/observable/throw';@Injectable()export class RequestService {  private setTimeout = 3000; // 默認的超時時間  constructor(private http:HttpClient) {  }     /** 獲取數據    * param: url  string   必填,請求的url    *     time  number   可不填,請求的超時時間,如不填,默認為setTimeout    * return:    Observable HttpClient的get請求,請求完成后返回的值類型是any    **/   public getData(url, time = this.setTimeout):Observable<any> {    let thiUrl = url; // 用到的url    let thisTime = time; // 用到的超時時間    return this.http.get(thiUrl)       .timeout(thisTime)       .map(res => this.resFun(res));   }   /** 返回數據的處理    * param:  data   any   必填,需要處理的數據    * return:  res   any   返回處理后的值    **/   private resFun(data:any):any {    let thisData:any = data; // 需要處理的值    let res:any; // 最終值    // 當status為200時    if (thisData['status'] == 200) {       res = thisData['data']; // 給最終值賦值    } else {    // 當status不為200時      let err = thisData['msg']; // 錯誤信息      throw new Error(err); // 拋出錯誤    }    return res; // 返回最終值   }}

需求B

1.為了安全,后臺要求請求的頭需要加上Authorization參數。

2.當請求失?。ㄈ?04,500這種)時,處理好錯誤信息,最后的錯誤信息要像 實現A 里一樣,是可以直接用的字符串類型的錯誤信息。

實現B

request.service.ts (只展示新增的代碼,完整代碼后面有)

import 'rxjs/add/operator/catch';@Injectable()export class RequestService {   /** 添加Authorization的屬性 */   private addAuthorization(options:any):void {     options['headers'] = {        'Authorization': '1drf5dg4d7s4w7z',     };    }      /** 獲取數據    * param: url  string   必填,請求的url    *     time  number   可不填,請求的超時時間,如不填,默認為setTimeout    * return:    Observable HttpClient的get請求,請求完成后返回的值類型是any    **/   public getData(url, time = this.setTimeout):Observable<any> {    let thiUrl = url; // 用到的url    let options = {}; // 請求的設置    let thisTime = time; // 用到的超時時間    this.addAuthorization(options); // 請求頭里添加Authorization參數    return this.http.get(thiUrl, options)       .timeout(thisTime)       .catch(this.httpErrorFun) // 處理錯誤信息(必須放在timeout和map之間)       .map(res => this.resFun(res));   }  /** 對請求錯誤信息的處理    * param:  err  any  必填,需要處理的錯誤信息    * return:  res  string 處理后的結果    **/   public httpErrorFun(err:any):string { /* new */    let res:string = ''; // 處理后的結果 /* new */    let data:any = err; // 需要處理的值 /* new */    /** 后臺有返回錯誤信息時 */    if (data.hasOwnProperty('error') && data.hasOwnProperty('message')) { /* new */       res = data.message; /* new */     /** 后臺沒有返回錯誤信息只有錯誤名時 */    } else if (data.hasOwnProperty('name')) { /* new */       let errName = data.name; /* new */     /** 請求超時 */     if (errName == 'TimeoutError') { /* new */      res = '對不起,請求超時了'; /* new */     }     /** 后臺返回未授權時 */    } else if (data == "Unauthorization") { /* new */       res = '您沒有權限,請重新登錄' /* new */      } else {       res = "哎呀,不知道是啥錯誤~~"; /* new */    }    return Observable.throw(res); /* new */   }}

完整的request service 代碼

request.service.ts

/** ******************************************************************************************** * @App: test * @author: isiico * @type: service * @src: services/request.service.ts * * @descriptions: * 請求的服務 * ******************************************************************************************** */// Angular Coreimport {Injectable} from '@angular/core';import {HttpClient} from '@angular/common/http';// rxjsimport {Observable} from 'rxjs/Observable';import 'rxjs/add/operator/map';import 'rxjs/add/operator/timeout';import 'rxjs/add/observable/throw';import 'rxjs/add/operator/catch';@Injectable()export class RequestService {  private setTimeout:number = 3000; // 默認的超時時間  constructor(private http:HttpClient) {  }   /** 添加Authorization的屬性 */   private addAuthorization(options:any):void {    options['headers'] = {       'Authorization': '1drf5dg4d7s4w7z',    };   }     /** 獲取數據    * param: url  string   必填,請求的url    *     time  number   可不填,請求的超時時間,如不填,默認為setTimeout    * return:    Observable HttpClient的get請求,請求完成后返回的值類型是any    **/   public getData(url, time = this.setTimeout):Observable<any> {    let thiUrl = url; // 用到的url    let options = {}; // 請求的設置    let thisTime = time; // 用到的超時時間    this.addAuthorization(options); // 請求頭里添加Authorization參數    return this.http.get(thiUrl, options)       .timeout(thisTime)       .catch(this.httpErrorFun) // 處理錯誤信息(必須放在timeout和map之間)       .map(res => this.resFun(res));   }   /** 返回數據的處理    * param:  data   any   必填,需要處理的數據    * return:  res   any   返回處理后的值    **/   private resFun(data:any):any {    let thisData:any = data; // 需要處理的值    let res:any; // 最終值    // 當status為200時    if (thisData['status'] == 200) {       res = thisData['data']; // 給最終值賦值    } else {    // 當status不為200時      let err = thisData['msg']; // 錯誤信息      throw new Error(err); // 拋出錯誤    }    return res; // 返回最終值   }  /** 對請求錯誤信息的處理    * param:  err  any  必填,需要處理的錯誤信息    * return:  res  string 處理后的結果    **/   public httpErrorFun(err:any):string {    let res:string = ''; // 處理后的結果    let data:any = err; // 需要處理的值    /** 后臺有返回錯誤信息時 */    if (data.hasOwnProperty('error') && data.hasOwnProperty('message')) {       res = data.message;     /** 后臺沒有返回錯誤信息只有錯誤名時 */    } else if (data.hasOwnProperty('name')) {       let errName = data.name;     /** 請求超時 */     if (errName == 'TimeoutError') {      res = '對不起,請求超時了';     }     /** 后臺返回未授權時 */    } else if (data == "Unauthorization") {       res = '您沒有權限,請重新登錄';      } else {       res = "哎呀,不知道是啥錯誤~~";    }    return Observable.throw(res);   }}

小結

至此,我們已經完成了一個滿足基本需求的,可以公共使用的請求服務,接下來我們來看怎么在組件內調用。

調用

我們有個叫list的組件,要調用get請求,請求成功顯示數據,請求失敗,顯示錯誤信息。

list.component.ts

/** ******************************************************************************************** * @App: test * @author: isiico * @type: component * @src: components/list.component.ts * * @descriptions: * list組件 * ******************************************************************************************** */// Angular Coreimport { Component, OnInit } from '@angular/core';// Servicesimport { RequestService } from "../services/request.service";@Component({ moduleId: module.id, templateUrl: 'list.component.html'})export class ListComponent implements OnInit {  listApi = '/assets/mock-data/list.json'; // 列表的api地址  list:Array<any>; // 列表數據(類型為數組)  listErrMsg: string = ''; // 列表請求的錯誤信息    constructor(private req: RequestService) {  }    /** 獲取list */  getList(){    this.listErrMsg = ''; // 清空錯誤信息    // 發送請求    this.req.getData(this.cabinetListApi)       .subscribe(      res=>{      // 請求成功        this.cabinets = [];        this.cabinets = res;       },err=>{      // 請求失敗        this.cabinets = [];        this.listErrMsg = err;     })   }    ngOnInit() {    this.getList();   }}

頁面的顯示自己去完成吧!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲乱亚洲乱妇无码| 亚洲成人网av| 91成人在线视频| 亚洲女人天堂成人av在线| 亚洲欧洲在线视频| 伊人激情综合网| 久久亚洲精品中文字幕冲田杏梨| 国产精品三级美女白浆呻吟| 欧美激情久久久久久| 欧美体内谢she精2性欧美| 国产精品香蕉在线观看| 中文字幕在线亚洲| 色综合久久中文字幕综合网小说| 亚洲美腿欧美激情另类| 国产一区二区三区视频免费| 久久久久久国产精品三级玉女聊斋| 97精品国产97久久久久久| 亚洲国产成人精品久久久国产成人一区| 亚洲国产高潮在线观看| 91极品视频在线| 亚洲欧洲在线视频| 久久久久久999| 国产精品久久久久久av福利软件| 久久久久免费精品国产| 欧美日韩亚洲一区二区三区| 欧美猛男性生活免费| 亚洲品质视频自拍网| 日韩成人激情视频| 亚州精品天堂中文字幕| 精品久久久久久久久国产字幕| 日韩av三级在线观看| 亚洲一区精品电影| 欧美大片免费观看在线观看网站推荐| 国产成人精品综合| 92看片淫黄大片欧美看国产片| 欧美丰满少妇xxxxx做受| 亚洲综合视频1区| 91在线高清视频| 成人a在线观看| 日韩欧美亚洲国产一区| 国产欧美婷婷中文| 九九精品在线视频| 久久久久免费精品国产| 亚洲欧美在线免费观看| 日韩精品久久久久| 亚洲福利小视频| 亚洲精品久久久久久久久久久久久| 亚洲第一页在线| 亚洲性日韩精品一区二区| 国产免费一区二区三区香蕉精| 国产拍精品一二三| 一区二区三区高清国产| 欧美国产中文字幕| 欧美高清videos高潮hd| 日韩成人在线免费观看| 亚洲成人免费在线视频| 精品在线欧美视频| 日韩视频在线免费观看| 亚洲欧美日韩一区二区三区在线| 亚洲三级av在线| 国内精品伊人久久| 国产主播在线一区| 久久久久久久久久久久久久久久久久av| 国产美女主播一区| 久久久久久香蕉网| 久久久精品久久久久| 中文字幕日韩在线观看| 午夜精品一区二区三区在线播放| 一个人看的www久久| 久久99精品视频一区97| 精品国产精品三级精品av网址| 国产精品成人国产乱一区| 一道本无吗dⅴd在线播放一区| 国产一区二区三区在线播放免费观看| 国外成人在线直播| 精品国产1区2区| 欧美乱妇高清无乱码| 91国语精品自产拍在线观看性色| 亚洲最新视频在线| 91精品久久久久| 久久久免费观看视频| 日韩av在线一区| 秋霞av国产精品一区| 久热99视频在线观看| 国外成人性视频| 美日韩丰满少妇在线观看| 影音先锋日韩有码| 琪琪第一精品导航| 亚洲国产天堂网精品网站| 久久成人av网站| 欧美午夜宅男影院在线观看| 亚洲欧美www| 4438全国亚洲精品在线观看视频| 国产精品久久久久久久久久久久久久| 中文字幕在线看视频国产欧美在线看完整| 最新日韩中文字幕| 中文字幕日韩综合av| 国模吧一区二区三区| 91久久久久久久久久久久久| 国产成人亚洲综合青青| 中文字幕亚洲色图| 国产精品自产拍在线观看中文| 少妇av一区二区三区| 久久视频在线视频| 午夜伦理精品一区| 精品久久国产精品| 国产欧美久久久久久| 色综合色综合久久综合频道88| 国产91精品在线播放| 日韩av电影在线免费播放| 久久手机免费视频| 亚洲人成电影网站色…| 在线电影欧美日韩一区二区私密| 亚洲国产成人久久综合一区| 亚洲精品美女免费| 91精品视频观看| 国产精品视频永久免费播放| 国产精品成人va在线观看| 粗暴蹂躏中文一区二区三区| 国产一区二区三区毛片| 国产欧美一区二区三区久久人妖| 国内免费精品永久在线视频| 亚洲男人天堂网| 日韩av毛片网| 18久久久久久| 久久免费精品视频| 亚洲精品在线观看www| 88xx成人精品| xxx成人少妇69| 亚洲精品一区二区网址| 亚洲欧美视频在线| 欧美激情精品久久久久久久变态| 国产精品久久久久国产a级| 国产成人精品视频在线观看| 国产成人高清激情视频在线观看| 国产精品入口尤物| 欧洲成人性视频| 久久成年人免费电影| 不卡毛片在线看| 亚洲视频免费一区| 日韩毛片在线观看| 精品国偷自产在线视频99| 日韩免费电影在线观看| 久久久国产影院| 国产一区av在线| 亚洲最新av在线| 亚洲精品一区二区久| 欧美大片免费观看在线观看网站推荐| 亚洲第一网站免费视频| 在线视频中文亚洲| 成人免费激情视频| 亚洲一区二区三区视频播放| 亚洲精品按摩视频| 亚洲v日韩v综合v精品v| 日韩中文字幕不卡视频| 久久久99久久精品女同性| 欧美性感美女h网站在线观看免费| 日韩视频亚洲视频| 欧美性猛交xxxx| 欧美一区二区三区四区在线| 亚洲欧美综合另类中字| 免费不卡欧美自拍视频| 欧美成人精品在线视频| 国产精品久久久久久久久久三级|