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

首頁 > 編程 > JavaScript > 正文

激動人心的 Angular HttpClient的源碼解析

2019-11-19 16:07:11
字體:
來源:轉載
供稿:網友

Angular 4.3.0-rc.0 版本已經發布🐦。在這個版本中,我們等到了一個令人興奮的新功能 - HTTPClient API 的改進版本,以后媽媽再也不用擔心我處理 HTTP 請求了😆。

HttpClient 是已有 Angular HTTP API 的演進,它在一個單獨的 @angular/common/http 包中。這是為了確?,F有的代碼庫可以緩慢遷移到新的 API。

接下來讓我們開啟 Angular 新版Http Client 之旅。

安裝

首先,我們需要更新所有的包到 4.3.0-rc.0 版本。然后,我們需要在 AppModule 中導入 HttpClientModule 模塊。具體如下:

import { HttpClientModule } from '@angular/common/http';@NgModule({ declarations: [  AppComponent ], imports: [  BrowserModule,  HttpClientModule ], bootstrap: [AppComponent]})export class AppModule { }

現在一切準備就緒。讓我們來體驗一下我們一直期待的三個新特性。

特性一 默認 JSON 解析

現在 JSON 是默認的數據格式,我們不需要再進行顯式的解析。即我們不需要再使用以下代碼:

http.get(url).map(res => res.json()).subscribe(...)

現在我們可以這樣寫:

http.get(url).subscribe(...)

特性二 支持攔截器 (Interceptors)

攔截器允許我們將中間件邏輯插入管線中。

請求攔截器 (Request Interceptor)

import { HttpRequest, HttpHandler, HttpEvent} from '@angular/common/http';@Injectable()class JWTInterceptor implements HttpInterceptor {  constructor(private userService: UserService) {}  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {  const JWT = `Bearer ${this.userService.getToken()}`;  req = req.clone({   setHeaders: {    Authorization: JWT   }  });  return next.handle(req); }}

如果我們想要注冊新的攔截器 (interceptor),我們需要實現 HttpInterceptor 接口,然后實現該接口中的 intercept 方法。

export interface HttpInterceptor { intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;}

需要注意的是,請求對象和響應對象必須是不可修改的 (immutable)。因此,我們在返回請求對象前,我們需要克隆原始的請求對象。

next.handle(req) 方法使用新的請求對象,調用底層的 XHR 對象,并返回響應事件流。

響應攔截器 (Response Interceptor)

@Injectable()class JWTInterceptor implements HttpInterceptor { constructor(private router: Router) {}  intercept(req: HttpRequest < any > ,  next: HttpHandler): Observable < HttpEvent < any >> {  return next.handle(req).map(event => {    if (event instanceof HttpResponse) {     if (event.status === 401) {      // JWT expired, go to login     }    }    return event;   }  }}

響應攔截器可以通過在 next.handle(req) 返回的流對象 (即 Observable 對象) 上應用附加的 Rx 操作符來轉換響應事件流對象。

接下來要應用 JWTInterceptor 響應攔截器的最后一件事是注冊該攔截器,即使用 HTTP_INTERCEPTORS 作為 token,注冊 multi Provider:

[{ provide: HTTP_INTERCEPTORS, useClass: JWTInterceptor, multi: true }]

特性三 進度事件 (Progress Events)

進度事件可以用于跟蹤文件上傳和下載。

import { HttpEventType, HttpClient, HttpRequest} from '@angular/common/http';http.request(new HttpRequest( 'POST',  URL,  body,  {  reportProgress: true })).subscribe(event => { if (event.type === HttpEventType.DownloadProgress) {  // {  // loaded:11, // Number of bytes uploaded or downloaded.  // total :11 // Total number of bytes to upload or download  // } } if (event.type === HttpEventType.UploadProgress) {  // {  // loaded:11, // Number of bytes uploaded or downloaded.  // total :11 // Total number of bytes to upload or download  // } } if (event.type === HttpEventType.Response) {  console.log(event.body); }})

如果我們想要跟蹤文件上傳或下載的進度,在創建請求對象時,我們需要配置 {reportProgress: true} 參數。

此外在回調函數中,我們通過 event.type 來判斷不同的事件類型,從進行相應的事件處理。

HttpEventType 枚舉定義如下:

export enum HttpEventType { /**  * 表示請求已經被發送  */ Sent, /**  * 已接收到上傳進度事件  */ UploadProgress, /**  * 已接收到響應狀態碼和響應頭  */ ResponseHeader, /**  * 已接收到下載進度事件  */ DownloadProgress, /**  * 已接收全部響應,包含響應體   */ Response, /**  * 用戶自定義事件,來自攔截器或后端  */ User,}

其實除了上面介紹三個新的功能之外,還有以下兩個新的功能:

  1. 基于 Angular 內部測試框架的 Post-request verification 和 flush 功能
  2. 類型化,同步響應體訪問,包括對 JSON 響應體類型的支持。

最后我們來通過 client_spec.ts 文件中的測試用例,來進一步感受一下上述的新特性。

其它特性

發送 GET 請求

describe('HttpClient', () => {  let client: HttpClient = null !;  let backend: HttpClientTestingBackend = null !;  beforeEach(() => {   backend = new HttpClientTestingBackend();   client = new HttpClient(backend);  });  afterEach(() => { backend.verify(); }); // 請求驗證   describe('makes a basic request', () => {   it('for JSON data', (done: DoneFn) => {    client.get('/test').subscribe(res => {     expect((res as any)['data']).toEqual('hello world');     done();    });    backend.expectOne('/test').flush({'data': 'hello world'});   });      it('for an arraybuffer', (done: DoneFn) => {    const body = new ArrayBuffer(4);    // 還支持 {responseType: 'text'}、{responseType: 'blob'}    client.get('/test', {responseType: 'arraybuffer'}).subscribe(res => {     expect(res).toBe(body);     done();    });    backend.expectOne('/test').flush(body);   });      it('that returns a response', (done: DoneFn) => {    const body = {'data': 'hello world'};    client.get('/test', {observe: 'response'}).subscribe(res => {     expect(res instanceof HttpResponse).toBe(true);     expect(res.body).toBe(body);     done();    });    backend.expectOne('/test').flush(body);   });  });});

發送 POST 請求

describe('makes a POST request', () => {   it('with text data', (done: DoneFn) => {    client.post('/test', 'text body', {observe: 'response', responseType: 'text'})      .subscribe(res => {       expect(res.ok).toBeTruthy();       expect(res.status).toBe(200);       done();      });    backend.expectOne('/test').flush('hello world');   });    it('with json data', (done: DoneFn) => {    const body = {data: 'json body'};    client.post('/test', body, {observe: 'response',      responseType: 'text'}).subscribe(res => {     expect(res.ok).toBeTruthy();     expect(res.status).toBe(200);     done();    });    const testReq = backend.expectOne('/test');    expect(testReq.request.body).toBe(body);    testReq.flush('hello world');   });});

發送 JSONP 請求

describe('makes a JSONP request', () => {   it('with properly set method and callback', (done: DoneFn) => {    client.jsonp('/test', 'myCallback').subscribe(() => done());    backend.expectOne({method: 'JSONP', url: '/test?myCallback=JSONP_CALLBACK'})      .flush('hello world');   });});

參考資源

A Taste From The New Angular HTTP Client

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级视频免费在线观看| 日韩视频一区在线| 日本成人免费在线| 97在线视频一区| 欧美主播福利视频| 九九久久久久久久久激情| 一区二区福利视频| 亚洲美女免费精品视频在线观看| 成人97在线观看视频| 欧美另类交人妖| 色www亚洲国产张柏芝| 在线精品国产欧美| 在线看国产精品| 在线播放日韩专区| 午夜精品一区二区三区在线| 亚洲精品国产综合久久| 国产成人久久久精品一区| 欧美精品在线看| 日韩精品中文字幕有码专区| 久久精品99久久久香蕉| 精品精品国产国产自在线| 国产福利视频一区| 国产色婷婷国产综合在线理论片a| 欧美精品福利视频| 国产综合在线视频| 九九热99久久久国产盗摄| 国内精品国产三级国产在线专| 国产精品久久久久久久久久三级| 少妇高潮 亚洲精品| 久久久久久综合网天天| 91系列在线播放| 国产日韩精品入口| 亚洲丝袜av一区| 久久国内精品一国内精品| 91九色综合久久| 国产精品白嫩初高中害羞小美女| 97在线视频免费观看| 国产成人一区二区三区电影| 色先锋久久影院av| 欧美日韩午夜剧场| 午夜精品久久久久久久99热| 日韩一区视频在线| 7777免费精品视频| 国产精品亚洲精品| 91久久精品视频| 国产suv精品一区二区| 日韩少妇与小伙激情| 欧美一区二区三区精品电影| 国产精品自产拍高潮在线观看| 国产成人在线播放| 欧美性视频网站| 久久91超碰青草是什么| 亚洲天堂男人的天堂| 欧美国产视频日韩| 日韩在线视频导航| 2021久久精品国产99国产精品| 亚洲欧美成人精品| 亚洲欧洲日本专区| 日韩的一区二区| 欧美激情亚洲国产| 欧美日韩在线另类| 欧美成人午夜影院| 精品欧美国产一区二区三区| 日韩欧美精品网站| 久久精品成人一区二区三区| 亚洲影影院av| 97香蕉超级碰碰久久免费软件| 欧美天堂在线观看| 91久久精品国产91久久| 国内精久久久久久久久久人| 欧美激情视频网址| 国产一区二区三区在线看| 91免费人成网站在线观看18| 欧美性猛交丰臀xxxxx网站| 国产欧美va欧美va香蕉在线| 国产成人精品一区二区三区| 91成品人片a无限观看| 91理论片午午论夜理片久久| 亚洲精品白浆高清久久久久久| 国产精品一二三在线| 久久6精品影院| 国产精品中文久久久久久久| 91高清免费在线观看| 欧美日韩国产成人在线观看| 亚洲欧美日韩国产精品| 午夜精品国产精品大乳美女| 美日韩精品免费视频| 亚洲春色另类小说| 日韩专区在线观看| 一区二区亚洲欧洲国产日韩| 国产亚洲精品高潮| 亚洲欧洲一区二区三区久久| 国产精品大片wwwwww| 欧美日韩免费看| 国产精品成人免费电影| 日本久久久a级免费| 亚洲综合中文字幕68页| 亚洲影院在线看| 欧美精品xxx| 97精品久久久| 日韩在线一区二区三区免费视频| 国产v综合v亚洲欧美久久| 国产欧美一区二区白浆黑人| 91中文字幕一区| 久久九九精品99国产精品| 性欧美亚洲xxxx乳在线观看| 国产精品91久久久| 国产精品一二三视频| 久久高清视频免费| 日韩视频免费观看| 亚洲精品国产欧美| 国产精品偷伦一区二区| 国产日韩精品入口| 国产69精品久久久久99| 在线视频日韩精品| 国产精品三级美女白浆呻吟| 亚洲专区国产精品| 91免费看视频.| 欧美一区二区三区四区在线| 国产精品日韩欧美综合| 亚洲欧美色婷婷| 中国china体内裑精亚洲片| 亚洲精品在线视频| 国产在线拍揄自揄视频不卡99| 黄色成人在线播放| 中文国产成人精品久久一| 国产精品青青在线观看爽香蕉| 亚洲综合大片69999| 91chinesevideo永久地址| 亚洲精品久久在线| 成人免费网站在线看| 日韩在线观看视频免费| 日韩美女免费视频| 97色在线视频观看| 成人a级免费视频| 色哟哟网站入口亚洲精品| 国产欧美一区二区三区四区| 午夜欧美不卡精品aaaaa| 日本久久久久久久久久久| 亚洲精品国精品久久99热| 成人黄色片网站| 欧美日韩亚洲高清| 久久成人这里只有精品| 欧美激情乱人伦| 亚洲护士老师的毛茸茸最新章节| 国产精品一区二区三区免费视频| 神马久久久久久| 日韩在线视频免费观看| 日韩一区二区三区国产| 国产精品视频精品视频| 亚洲欧美激情一区| 欧美制服第一页| 中文字幕久热精品视频在线| 亚洲视频在线看| 久久视频国产精品免费视频在线| 国产成人a亚洲精品| 久久99精品国产99久久6尤物| 成人性生交大片免费看视频直播| 欧美自拍视频在线| 亚洲激情电影中文字幕| 亚洲韩国日本中文字幕| 欧美精品精品精品精品免费| 97在线视频一区| 国产精品扒开腿爽爽爽视频|