Angular 4+ HttpClient

來源:互聯網
上載者:User

標籤:opera   div   設定   tor   控制   發送   ams   方法   jsonp   

這篇,算是上一篇Angular 4+ Http的後續;

Angular 4.3.0-rc.0 版本已經發布??。在這個版本中,我們等到了一個令人興奮的新功能 - HTTPClient API 的改進版本;

HttpClient 是已有 Angular HTTP API 的演化,它在一個單獨的 @angular/common/http 包中。這是為了確保現有的程式碼程式庫可以緩慢遷移到新的 API;

大多數前端應用都需要通過 HTTP 協議與後端伺服器通訊。現代瀏覽器支援使用兩種不同的 API 發起 HTTP 要求:XMLHttpRequest 介面和 fetch() API;

@angular/common/http中的HttpClient類,Angular 為應用程式提供了一個簡化的 API 來實現 HTTP 功能。它基於瀏覽器提供的XMLHttpRequest介面。 HttpClient帶來的其它優點包括:可測試性、強型別的請求和響應對象、發起請求與接收響應時的攔截器支援,以及更好的、基於可觀察(Observable)對象的錯誤處理機制;

1.如何使用httpClient;

import {NgModule} from ‘@angular/core‘;import {BrowserModule} from ‘@angular/platform-browser‘;import {HttpClientModule} from ‘@angular/common/http‘;@NgModule({  imports: [    BrowserModule,    // Include it under ‘imports‘ in your application module    // after BrowserModule.    HttpClientModule,  ],})export class MyAppModule {}

注意:匯入方式和HttpModule一樣的,記得要在BrowserModule後面匯入;區別是:在@angular/common/http 模組裡面,而不是@angular/http中

這樣我們可以使用這些啦:

class HttpClient {  request(first: string|HttpRequest<any>, url?: string, options: {...}): Observable<any>  delete(url: string, options: {...}): Observable<any>  get(url: string, options: {...}): Observable<any>  head(url: string, options: {...}): Observable<any>  jsonp<T>(url: string, callbackParam: string): Observable<T>  options(url: string, options: {...}): Observable<any>  patch(url: string, body: any|null, options: {...}): Observable<any>  post(url: string, body: any|null, options: {...}): Observable<any>  put(url: string, body: any|null, options: {...}): Observable<any>}   

2.發起一個請求來擷取Json資料;

   首先建立一個json檔案,其實就是上一篇的同一個json檔案:

{  "data": [    { "id": 1, "name": "Windstorm" },    { "id": 2, "name": "Bombasto" },    { "id": 3, "name": "Magneta" },    { "id": 4, "name": "Tornado" }  ]}

怎麼調用Http請求呢?

   2.1 app.componment.ts;

import { Component,OnInit } from ‘@angular/core‘;import {HttpClient} from ‘@angular/common/http‘;  /*注釋1*/@Component({  selector: ‘app-root‘,  templateUrl: ‘./app.component.html‘,  styleUrls: [‘./app.component.css‘]})export class AppComponent  implements OnInit {constructor(private http:HttpClient){}  datas:string[];  ngOnInit(){    this.http.get(‘./assets/heroes.json‘).subscribe(data=>{  /*注釋2*/         this.datas=data[‘data‘];         console.log(this.datas)    })   }}

注意:

  注釋1: 組件中引入的是HttpClient,也是在單獨的庫,@angular/common/http中;

               之前的項目裡面引入的一直都是http,這就是改版後的區別;

  注釋2:現在 JSON 是預設的資料格式,我們不需要再進行顯式的解析;this.http.get(‘xx‘).subscribe();

              之前的還需要res.json()去手動轉;

 還有一點要注意:我並沒有去hero.service.ts裡面去操作了,而是直接在組件中發請求擷取資料,這樣更加簡單明了;

<div>  <ul  *ngFor="let data of datas">    <li>{{data.id}}  {{data.name}}</li>  </ul></div>

html代碼還是一樣簡單,並沒有改變;

這是相比較之前的Http簡單的方式;

  get(url: string, options: {    headers?: HttpHeaders,    observe?: HttpObserve,    params?: HttpParams,    reportProgress?: boolean,    responseType?: ‘arraybuffer‘|‘blob‘|‘json‘|‘text‘,    withCredentials?: boolean,  }): Observable<any> 

這是get方法詳解,請注意,返回的都是observable對象,而不是使用promise了;

3.響應體的檢查

   3.1上面的代碼中:

 datas:string[];   //定義一個介面來描述這個類型的正確形態this.datas=data[‘data‘]; /*注釋1*/

 注釋1:

   我們取json對象data值時要data[‘data‘],而不是之前的data.data了;如果改成:

 this.datas=data.data;

會報錯:

 does not exist on type ‘Object

那是因為HttpClient把 JSON 格式的響應體解析成了一個Object,它並不知道這個對象的形態應該是什麼。所以我們應該告訴你需要取得data是個什麼類型;這也是更符合typescript文法的做法;

4. 如果將要擷取的不是JSON檔案如何?

 this.http.get(‘/assets/1.txt‘,{responseType:‘text‘}).subscribe(      data=>console.log(data))

注意:這樣我們就要指定需要擷取的文字格式設定;

  控制台將會列印我的1.txt中的內容:www.sulishibaobei.com

 5.如何帶參查詢資料

  const params = new HttpParams()    .set(‘id‘, ‘1‘).set(‘name‘,‘Windstorm‘)    this.cus=this.http.get(‘assets/heroes.json‘,{params})    .do(console.log)    .map(data=>        console.log( _.values(data))
);

引入:httpParams參數:

import {HttpClient, HttpParams} from ‘@angular/common/http‘;

我們通過鏈式文法調用set()方法,構建了params對象;每當set()方法被調用時,都會包含新的值進來,並且防止之前對象不被修改;

http://localhost:4200/assets/heroes.json?id=1&name=Windstorm

請求的連結地址將會是這樣的形式;這個有點像http裡添加url參數;

還可以設定Headers;

const headers = new HttpHeaders().set("X-CustomHeader", "custom header value");

還有其他的請求,之後會逐一分析;

另外還有幾點比較重要的:

  多行並發發送請求和順序發送請求,避免發送重複請求;

避免發送重複請求import ‘rxjs/add/operator/shareReplay‘;const httpGet = this.http    .get("assets/heroes.json")    .map(data => _.values(data))    .shareReplay();這樣即使你將 httpGet再賦值給另一個變數,或重複調用也不會再次請求了
並行發送 HTTP 要求的一種方法是使用 RxJs 中的 forkjoin 操作符:import ‘rxjs/add/observable/forkJoin‘;Requests() {    const result = Observable.forkJoin(        this.http.get(‘/assets/heroes.json‘),        this.http.get(‘/assets/heroes.json‘)    );   result.subscribe(        values => {            console.log("all values", values)        }    );}
順序發送請求sequentialRequests() {    const sequence$ = this.http.get<Hero>(‘/assets/heroes.json‘)        .switchMap(hero => {            hero.id+= ‘ - TEST ‘;            return this.http.put(‘/assets/heroes.json‘, hero)        });            sequence$.subscribe();}

6. 攔截器  (攔截所有的請求和響應這也是@angular/common/http的核心特性之一)

    它能聲明一些攔截器,攔在應用和後端之間。當應用程式發起一個請求時,攔截器可以在請求被發往伺服器之前先轉換這個請求。並且在應用看到伺服器發回來的響應之前,轉換這個響應。這對於處理包括認證和記錄日誌在內的一系列工作都非常有用。

  6.1 如何寫一個攔截器

import {Injectable} from ‘@angular/core‘;import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse} from ‘@angular/common/http‘;import {Observable} from ‘Rxjs/Observable‘;@Injectable()export class NoopInterceptor implements HttpInterceptor {   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;      }   } }

1.intercept是一個方法,它把一個請求對象轉換成一個返回這個響應的可觀察對象(Observable)。從這個意義上說,每個攔截器都要完全自己處理這個請求;

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

內部可以做自己的處理操作;

但是此時攔截器還未使用在組件上;

 

import {NgModule} from ‘@angular/core‘;import {HTTP_INTERCEPTORS} from ‘@angular/common/http‘;@NgModule({  providers: [{    provide: HTTP_INTERCEPTORS,    useClass: NoopInterceptor,    multi: true,  }],})export class AppModule {}

 

providers裡面配置我們的資訊;

注意multi: true選項。這是必須的,因為它會告訴 Angular 這個 HTTP_INTERCEPTORS 表示的是一個數組,而不是單個的值;

 

 

 

 

 

 

 

 

 

 

 

     

   

Angular 4+ HttpClient

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.