Angualr 訪問(wèn)遠(yuǎn)程 API

一個(gè) Web 應(yīng)用通常會(huì)連接到遠(yuǎn)程服務(wù)器妻率,使用基于HTTP 協(xié)議的 API 對(duì)數(shù)據(jù)進(jìn)行操作不翩,如檢索、更新酸休、創(chuàng)建和刪除(CRUD)等。

本文通過(guò)一個(gè)實(shí)例來(lái)介紹如何在 Angular 應(yīng)用中訪問(wèn)遠(yuǎn)程的 API.

模擬遠(yuǎn)程 API

很多時(shí)候祷杈,我們沒(méi)有條件訪問(wèn)一個(gè)真正的后端 API 服務(wù)斑司。例如:

  • 在創(chuàng)建一個(gè)快速原型的時(shí)候
  • 可用的 API 服務(wù)還沒(méi)有交付
  • 沒(méi)有 VPN,無(wú)法連接遠(yuǎn)程服務(wù)器

我們可以創(chuàng)建一個(gè)完全運(yùn)行在內(nèi)存的 API 服務(wù),模擬 Web 應(yīng)用所需要的 API 服務(wù)宿刮。

  1. 安裝必要的開發(fā)包互站。
npm install angular-in-memory-web-api@0.11.0 --save-dev

注意:angular-in-memory-web-api 的版本 0.11.0 適合于 Angular 10.

  1. 創(chuàng)建一個(gè) Angular 服務(wù),實(shí)現(xiàn) InMemoryDbService interface 接口僵缺。
import { Injectable } from '@angular/core’;
import { InMemoryDbService } from "angular-in-memory-web-api”;

@Injectable({
  providedIn: ‘root’
})
export class DataService implements InMemoryDbService {

  constructor() { }

  createDb() {
      return {
        books: [
          {id: 1, name: '《三體》', price: 50.00},
          {id: 2, name: '《黑暗森林》', price: 40.00},
          {id: 3, name: '《死神永生》', price: 60.00},
          {id: 4, name: '《超新星紀(jì)元》', price: 35.00}
        ]
      }
  }
}

Angular 服務(wù)必須實(shí)現(xiàn) InMemoryDbService 接口的 createDb 方法胡桃,該方法會(huì)創(chuàng)建一個(gè)內(nèi)存對(duì)象,表示一個(gè)數(shù)據(jù)庫(kù)磕潮。

  1. 導(dǎo)入 HttpClientInMemoryWebApiModule 模塊翠胰。
import { BrowserModule } from '@angular/platform-browser’;
import { NgModule } from '@angular/core’;
import { HttpClientInMemoryWebApiModule } from "angular-in-memory-web-api”;

import { AppComponent } from './app.component’;
import { DataService } from "./data.service”;
import { BooksModule } from './books/books.module’;

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientInMemoryWebApiModule.forRoot(DataService),
    BooksModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

與導(dǎo)入 BrowserModule 模塊不同,我們使用了 forRoot 方法自脯,把 DataService 作為參數(shù)傳入之景,這樣可以確保只創(chuàng)建單一實(shí)例。

訪問(wèn)遠(yuǎn)程 API

接下來(lái)膏潮,我們使用 Angular 框架的內(nèi)置 HTTP 客戶端訪問(wèn)數(shù)據(jù)服務(wù)锻狗。

  1. AppModule 模塊中導(dǎo)入 HttpClientModule 模塊,使用 HttpClientModule 模塊中的服務(wù)處理異步的 HTTP 通信焕参。
import { BrowserModule } from '@angular/platform-browser’;
import { NgModule } from '@angular/core’;
import { HttpClientInMemoryWebApiModule } from "angular-in-memory-web-api”;
import { HttpClientModule } from "@angular/common/http”;

import { AppComponent } from './app.component’;
import { DataService } from "./data.service”;
import { BooksModule } from './books/books.module’;

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    HttpClientInMemoryWebApiModule.forRoot(DataService),
    BooksModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

在導(dǎo)入 HttpClientModule 模塊時(shí)轻纪,要讓 HttpClientModule 模塊位于 HttpClientInMemoryWebApiModule 模塊之前,使后者可以覆蓋前者的默認(rèn)行為龟糕。

  1. HeroService 服務(wù)中注入 HttpClient.
import { Injectable } from '@angular/core’;
import { HttpClient } from "@angular/common/http”;
import { Book } from './book.model’;

@Injectable({
  providedIn: ‘root’
})
export class BookService {

  constructor(private http: HttpClient) { }

  getBooks(): Book[] {
    return [
      {id: 1, name: '《三體》', price: 50.00},
      {id: 2, name: '《黑暗森林》', price: 40.00},
      {id: 3, name: '《死神永生》', price: 60.00},
      {id: 4, name: '《超新星紀(jì)元》', price: 35.00}
    ];
  }
}
  1. 修改 getBooks 方法桐磁,使其通過(guò) HttpClient 獲取圖書列表數(shù)據(jù)。
import { Injectable } from '@angular/core’;
import { HttpClient } from "@angular/common/http”;
import { Book } from './book.model’;
import { Observable } from ‘rxjs’;

@Injectable({
  providedIn: ‘root’
})
export class BookService {

  constructor(private http: HttpClient) { }

  getBooks(): Observable<Book[]> {
    return this.http.get<Book[]>('api/books’);
  }
}

4.在 BookListComponent 類中讲岁,修改獲取圖書數(shù)據(jù)的邏輯我擂。

import { Component, OnInit } from '@angular/core’;
import { Book } from '../book.model’;
import { BookService } from '../book.service’;

@Component({
  selector: 'app-book-list’,
  templateUrl: './book-list.component.html’,
  styleUrls: ['./book-list.component.css’]
})
export class BookListComponent implements OnInit {

  books: Book[];

  constructor(private bookService: BookService) {
  }

  ngOnInit(): void {
    this.getBooks();
  }

  private getBooks() {
    this.bookService.getBooks().subscribe(books => this.books = books);
  }

}

驗(yàn)證訪問(wèn)效果

訪問(wèn) Web API 展示圖書列表

在頁(yè)面上圖書列表時(shí),會(huì)有一些延時(shí)缓艳,這是內(nèi)存 Web API 模擬了真實(shí)的請(qǐng)求/響應(yīng)的處理時(shí)間校摩。我們可以在 HttpClientInMemoryWebApiModule 模塊的 forRoot 方法配置 delay 屬性,改變延時(shí)時(shí)長(zhǎng)阶淘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衙吩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溪窒,更是在濱河造成了極大的恐慌坤塞,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澈蚌,死亡現(xiàn)場(chǎng)離奇詭異摹芙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)宛瞄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門浮禾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事盈电『兀” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵匆帚,是天一觀的道長(zhǎng)熬词。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吸重,這世上最難降的妖魔是什么荡澎? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮晤锹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彤委。我一直安慰自己鞭铆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布焦影。 她就那樣靜靜地躺著车遂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斯辰。 梳的紋絲不亂的頭發(fā)上舶担,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音彬呻,去河邊找鬼衣陶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛闸氮,可吹牛的內(nèi)容都是我干的剪况。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蒲跨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼译断!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起或悲,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤孙咪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后巡语,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翎蹈,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年捌臊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杨蛋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逞力,靈堂內(nèi)的尸體忽然破棺而出曙寡,到底是詐尸還是另有隱情,我是刑警寧澤寇荧,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布举庶,位于F島的核電站,受9級(jí)特大地震影響揩抡,放射性物質(zhì)發(fā)生泄漏户侥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一峦嗤、第九天 我趴在偏房一處隱蔽的房頂上張望蕊唐。 院中可真熱鬧,春花似錦烁设、人聲如沸替梨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)副瀑。三九已至,卻和暖如春恋谭,著一層夾襖步出監(jiān)牢的瞬間糠睡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工疚颊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狈孔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓串稀,卻偏偏與公主長(zhǎng)得像除抛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子母截,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容