最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

激動(dòng)人心的 Angular HttpClient的源碼解析

 更新時(shí)間:2017年07月10日 11:28:43   作者:semlinker  
這篇文章主要介紹了Angular HttpClient的源碼解析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Angular 4.3.0-rc.0 版本已經(jīng)發(fā)布🐦。在這個(gè)版本中,我們等到了一個(gè)令人興奮的新功能 - HTTPClient API 的改進(jìn)版本,以后媽媽再也不用擔(dān)心我處理 HTTP 請(qǐng)求了😆。

HttpClient 是已有 Angular HTTP API 的演進(jìn),它在一個(gè)單獨(dú)的 @angular/common/http 包中。這是為了確?,F(xiàn)有的代碼庫(kù)可以緩慢遷移到新的 API。

接下來(lái)讓我們開(kāi)啟 Angular 新版Http Client 之旅。

安裝

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

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

現(xiàn)在一切準(zhǔn)備就緒。讓我們來(lái)體驗(yàn)一下我們一直期待的三個(gè)新特性。

特性一 默認(rèn) JSON 解析

現(xiàn)在 JSON 是默認(rèn)的數(shù)據(jù)格式,我們不需要再進(jìn)行顯式的解析。即我們不需要再使用以下代碼:

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

現(xiàn)在我們可以這樣寫(xiě):

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

特性二 支持?jǐn)r截器 (Interceptors)

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

請(qǐng)求攔截器 (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);
 }
}

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

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

需要注意的是,請(qǐng)求對(duì)象和響應(yīng)對(duì)象必須是不可修改的 (immutable)。因此,我們?cè)诜祷卣?qǐng)求對(duì)象前,我們需要克隆原始的請(qǐng)求對(duì)象。

next.handle(req) 方法使用新的請(qǐng)求對(duì)象,調(diào)用底層的 XHR 對(duì)象,并返回響應(yīng)事件流。

響應(yīng)攔截器 (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;
   }
  }
}

響應(yīng)攔截器可以通過(guò)在 next.handle(req) 返回的流對(duì)象 (即 Observable 對(duì)象) 上應(yīng)用附加的 Rx 操作符來(lái)轉(zhuǎn)換響應(yīng)事件流對(duì)象。

接下來(lái)要應(yīng)用 JWTInterceptor 響應(yīng)攔截器的最后一件事是注冊(cè)該攔截器,即使用 HTTP_INTERCEPTORS 作為 token,注冊(cè) multi Provider:

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

特性三 進(jìn)度事件 (Progress Events)

進(jìn)度事件可以用于跟蹤文件上傳和下載。

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);
 }
})

如果我們想要跟蹤文件上傳或下載的進(jìn)度,在創(chuàng)建請(qǐng)求對(duì)象時(shí),我們需要配置 {reportProgress: true} 參數(shù)。

此外在回調(diào)函數(shù)中,我們通過(guò) event.type 來(lái)判斷不同的事件類(lèi)型,從進(jìn)行相應(yīng)的事件處理。

HttpEventType 枚舉定義如下:

export enum HttpEventType {
 /**
  * 表示請(qǐng)求已經(jīng)被發(fā)送
  */
 Sent,

 /**
  * 已接收到上傳進(jìn)度事件
  */
 UploadProgress,

 /**
  * 已接收到響應(yīng)狀態(tài)碼和響應(yīng)頭
  */
 ResponseHeader,

 /**
  * 已接收到下載進(jìn)度事件
  */
 DownloadProgress,

 /**
  * 已接收全部響應(yīng),包含響應(yīng)體 
  */
 Response,

 /**
  * 用戶自定義事件,來(lái)自攔截器或后端
  */
 User,
}

其實(shí)除了上面介紹三個(gè)新的功能之外,還有以下兩個(gè)新的功能:

  1. 基于 Angular 內(nèi)部測(cè)試框架的 Post-request verification 和 flush 功能
  2. 類(lèi)型化,同步響應(yīng)體訪問(wèn),包括對(duì) JSON 響應(yīng)體類(lèi)型的支持。

最后我們來(lái)通過(guò) client_spec.ts 文件中的測(cè)試用例,來(lái)進(jìn)一步感受一下上述的新特性。

其它特性

發(fā)送 GET 請(qǐng)求

describe('HttpClient', () => {
  let client: HttpClient = null !;
  let backend: HttpClientTestingBackend = null !;
  beforeEach(() => {
   backend = new HttpClientTestingBackend();
   client = new HttpClient(backend);
  });
  afterEach(() => { backend.verify(); }); // 請(qǐng)求驗(yàn)證
 
  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);
   });
  });
});

發(fā)送 POST 請(qǐng)求

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');
   });
});

發(fā)送 JSONP 請(qǐng)求

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Angular.js 實(shí)現(xiàn)數(shù)字轉(zhuǎn)換漢字實(shí)例代碼

    Angular.js 實(shí)現(xiàn)數(shù)字轉(zhuǎn)換漢字實(shí)例代碼

    這篇文章主要介紹了Angular.js 實(shí)現(xiàn)數(shù)字轉(zhuǎn)換漢字實(shí)例代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • Angularjs自定義指令實(shí)現(xiàn)分頁(yè)插件(DEMO)

    Angularjs自定義指令實(shí)現(xiàn)分頁(yè)插件(DEMO)

    由于最近的一個(gè)項(xiàng)目使用的是angularjs1.0的版本,涉及到分頁(yè)查詢數(shù)據(jù)的功能,后來(lái)自己就用自定義指令實(shí)現(xiàn)了該功能,下面小編把實(shí)例demo分享到腳本之家平臺(tái),需要的朋友參考下
    2017-09-09
  • AngularJS 所有版本下載地址

    AngularJS 所有版本下載地址

    這篇文章主要介紹了 AngularJS 所有版本下載地址的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • angular $watch 一個(gè)變量的變化(實(shí)例講解)

    angular $watch 一個(gè)變量的變化(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇angular $watch 一個(gè)變量的變化(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • angularJS實(shí)現(xiàn)動(dòng)態(tài)添加,刪除div方法

    angularJS實(shí)現(xiàn)動(dòng)態(tài)添加,刪除div方法

    下面小編就為大家分享一篇angularJS實(shí)現(xiàn)動(dòng)態(tài)添加,刪除div方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 詳解Angularjs中的依賴(lài)注入

    詳解Angularjs中的依賴(lài)注入

    這篇文章主要為大家詳細(xì)介紹了Angularjs中的依賴(lài)注入,AngularJS提供了一個(gè)至高無(wú)上的依賴(lài)注入機(jī)制,感興趣的小伙伴們可以參考一下
    2016-03-03
  • angularjs中$http異步上傳Excel文件方法

    angularjs中$http異步上傳Excel文件方法

    本篇文章給大家詳細(xì)分析了angularjs中$http異步上傳Excel文件方法,對(duì)此有需要的讀者可以學(xué)習(xí)下。
    2018-02-02
  • 將angular-ui的分頁(yè)組件封裝成指令的方法詳解

    將angular-ui的分頁(yè)組件封裝成指令的方法詳解

    這篇文章主要給大家介紹了將angular-ui的分頁(yè)組件封裝成指令的方法,文中介紹的非常詳細(xì),相信會(huì)對(duì)大家的學(xué)習(xí)或者工作覺(jué)有一定的參考價(jià)值,需要的朋友下面來(lái)一起看看吧。
    2017-05-05
  • AngularJs 國(guó)際化(I18n/L10n)詳解

    AngularJs 國(guó)際化(I18n/L10n)詳解

    本文主要介紹AngularJs 國(guó)際化的知識(shí),這里整理了詳細(xì)的資料來(lái)講解國(guó)際化,有需要的小伙伴可以參考下
    2016-09-09
  • AngularJS中的按需加載ocLazyLoad示例

    AngularJS中的按需加載ocLazyLoad示例

    本篇文章主要介紹了AngularJS中的按需加載ocLazyLoad,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01

最新評(píng)論

昂仁县| 屏东市| 哈巴河县| 云龙县| 绥宁县| 平顶山市| 夏津县| 汨罗市| 岳阳市| 南丰县| 甘洛县| 湛江市| 田林县| 正阳县| 塘沽区| 齐齐哈尔市| 余姚市| 铁力市| 句容市| 迁安市| 祥云县| 雷波县| 利津县| 琼结县| 海盐县| 平顺县| 且末县| 六安市| 章丘市| 独山县| 晋城| 连平县| 阿拉尔市| 天柱县| 全南县| 酒泉市| 贵州省| 泽普县| 华宁县| 同心县| 壶关县|