本文是SitePoint Angular 2教程的第3部分,介紹瞭如何使用Angular CLI創建CRUD應用程序。在本文中,我們將更新我們的應用程序,以與REST API後端進行通信。
> >更喜歡使用分步視頻課程學習角度?在SitePoint Premium上查看學習Angular 5。 在第一部分中,我們學會瞭如何將待辦器應用程序啟動,運行並部署到github頁面。這效果很好,但是不幸的是,整個應用都被擠入了一個組件。 在第二部分中,我們檢查了一個更模塊化的組件體系結構,並學習瞭如何將這個單個組件分解為一個較小組件的結構化樹,這些成分易於理解,重複使用和維護。第0部分 - 終極角度CLI參考指南
第1部分 - 獲取我們的第一個todo應用程序啟動和運行
>在與REST API通信時,使用RXJS使用Angular的HTTPClient來有效處理異步HTTP請求。
>當前,TodoDataservice將所有數據存儲在內存中。在第三篇文章中,我們將更新我們的應用程序,以與REST API後端進行通信。
我們將:
在本文結尾處,您將了解:
>如何使用環境變量存儲應用程序設置
>確保已安裝了最新版本的Angular CLI。如果不這樣
之後,您需要從第二部分中的代碼副本。這可以在Github上找到。本系列中的每個文章在存儲庫中都有一個相應的標籤,因此您可以在應用程序的不同狀態之間來回切換。
<span>npm install -g @angular/cli@latest </span>>我們在第二部分中以本文開始的代碼被標記為第2部分。我們結束本文的代碼被標記為第3部分。
>
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>>您可以將標籤視為特定提交ID的別名。您可以使用Git Checkout在它們之間切換。您可以在此處閱讀更多信息。
>因此,要啟動並運行(已安裝了Angular CLI的最新版本),我們將執行此操作:
>然後訪問http:// localhost:4200/。如果一切順利,您應該看到工作的todo應用程序。
設置REST API後端>讓我們使用JSON服務器快速設置模擬後端。
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve從應用程序的根部運行:
>
>最後,將腳本添加到package.json開始我們的後端:
我們現在可以使用以下方式啟動REST API後端
<span>npm install json-server --save </span>
這應該顯示以下內容:
<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>就是這樣!現在,我們在端口3000上有一個REST API後端。
>要驗證您的後端是否按預期運行,您可以將瀏覽器導航到http:// localhost:3000。
<span>"scripts": { </span> <span>... </span> <span>"json-server": "json-server --watch db.json" </span><span>} </span>支持以下端點:
>因此,如果您將瀏覽器導航到http:// localhost:3000/todos,則應看到DB.JSON的所有Todos的JSON響應
>要了解有關JSON服務器的更多信息,請確保使用JSON-Server查看模擬REST API。存儲API URL
>將URL存儲在一個地方,這樣我們只需要在需要更改其值
使我們的應用程序在開發過程中連接到開發API,並連接到生產中的生產API。
>當我們運行NG服務或NG構建時,Angular CLI使用開發環境中指定的值(SRC/Environments/Environment.TS)。
但是,當我們運行ng服務 - 環境產品或ng構建 - 環境產品時,Angular CLI使用SRC/Environments/Environment.prod.ts。
中指定的值<span>npm install -g @angular/cli@latest </span>這正是我們需要使用不同的API URL進行開發和生產,而不必更改我們的代碼。
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>>
>
本文系列中的應用程序未託管在生產中,因此我們在開發和生產環境中指定了相同的API URL。這使我們能夠運行NG服務 - 環境產品或NG構建 - 環境在當地生產,以查看一切是否按預期工作。<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve>您可以在.angular-cli.json中找到Dev和Prod之間的映射及其相應的環境文件:
>您還可以通過添加鍵來創建其他環境,例如分期:
並創建相應的環境文件。
要了解有關角CLI環境的更多信息,請確保查看“終極角CLI參考指南”。 >現在我們將API URL存儲在環境中,我們可以創建一個角度服務以與REST API後端進行通信。
創建服務以與REST API後端通信>讓我們使用Angular CLI創建一個Apiservice與我們的REST API後端進行通信:
<span>npm install json-server --save </span>
>這給出以下輸出:
<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>
<span>npm install -g @angular/cli@latest </span>-module app.module.ts選項
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
在我們實施所需的方法之前,讓我們看看Angular的HTTP服務。
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve如果您不熟悉語法,為什麼不購買我們的高級課程,介紹Typescript。
Angular HTTP服務
Angular HTTP服務可作為 @angular/http的注射類別提供 >它構建在XHR/JSONP之上,並為我們提供了一個HTTP客戶端,我們可以使用該客戶端從Angular應用程序中提出HTTP請求。
可用於執行HTTP請求的以下方法:get(url,選項):執行get request
head(url,選項):執行頭部請求
>選項(url,選項):執行選項請求
如果我們回想起端點,我們的REST API後端會公開:
get /todos:獲取所有現有的todos
get /todos /:id:獲取現有的todo
post /todos:創建一個新的todo
put /todos /:id:更新現有的todo
我們已經可以創建我們需要的方法的粗略輪廓及其相應的角度HTTP方法:
>
getalltodos()
這將返回可觀察的。
然後,我們在可觀察的上調用映射()方法,以將響應從API轉換為todo對象的數組:<span>npm install -g @angular/cli@latest </span>
>傳入的HTTP響應是一個字符串,因此我們首先調用響應。
然後,我們循環瀏覽API響應的招待,然後返回一系列TODO實例。請注意,映射()的第二次使用是使用array.prototype.map(),而不是rxjs operator。>最後,我們將一個錯誤處理程序附加到記錄潛在錯誤到控制台:
我們在單獨的方法中定義了錯誤處理程序,因此我們可以以其他方法重複使用:
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
>在運行此代碼之前,我們必須從RXJS庫中導入必要的依賴項:
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve請注意,RXJS庫很大。與其使用“ rxjs/rx”中的import * as rx導入整個RXJS庫,不如說僅導入所需的零件。這將實質上將所得代碼捆綁包的大小減少到最低。
在我們的應用程序中,我們導入可觀察的類:
<span>npm install json-server --save </span>
我們導入代碼所需的三個運算符:
>進口操作員確保我們可觀察的實例與它們附加了相應的方法。
<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>
如果我們在代碼中沒有導入的'rxjs/add/operator/map',則以下內容將行不通:
><span>"scripts": { </span> <span>... </span> <span>"json-server": "json-server --watch db.json" </span><span>} </span>
這是因為this.http.get返回的可觀察的可觀察到不會有map()方法。
>>我們只需要一次導入操作員即可在您的應用程序中在全球範圍內啟用相應的可觀察方法。但是,多次導入它們並不是問題,也不會增加由此產生的捆綁包大小。
><span>npm run json-server </span>getTodobyId()
getTodobyId()方法允許我們獲得一個todo:
>
createTodo()
<span>\{^_^}/ hi! </span> Loading db.json Done Resources http://localhost:3000/todos Home http://localhost:3000createTodo()方法允許我們創建一個新的todo:
>我們首先對我們的API執行郵政請求,並將數據傳遞為第二個參數:
updateTodo()
<span>// src/environments/environment.ts </span><span>// used when we run `ng serve` or `ng build` </span><span>export const environment = { </span> production<span>: false, </span> <span>// URL of development API </span> apiUrl<span>: 'http://localhost:3000' </span><span>}; </span>
updateTodo()方法允許我們更新單個todo:
<span>// src/environments/environment.prod.ts </span><span>// used when we run `ng serve --environment prod` or `ng build --environment prod` </span><span>export const environment = { </span> production<span>: true, </span> <span>// URL of production API </span> apiUrl<span>: 'http://localhost:3000' </span><span>}; </span>>我們首先對API執行PUT請求,並將數據傳遞為第二個參數:
然後,我們將響應轉換為一個todo對象:
<span>import { environment } from 'environments/environment'; </span> <span>// we can now access environment.apiUrl </span><span>const API_URL = environment.apiUrl; </span>
deletetodobyid()方法允許我們刪除單個todo:
<span>"environments": { </span> <span>"dev": "environments/environment.ts", </span> <span>"prod": "environments/environment.prod.ts" </span><span>} </span>我們首先對API執行刪除請求:
然後,我們將響應轉換為null:
<span>"environments": { </span> <span>"dev": "environments/environment.ts", </span> <span>"staging": "environments/environment.staging.ts", </span> <span>"prod": "environments/environment.prod.ts" </span><span>} </span>
>我們真的不需要在這裡改變響應,並且可以忽略這一行。僅包括您在執行刪除請求時API返回數據時如何處理響應的方法。
ng generate <span>service Api --module app.module.ts </span>這是我們的apiservice的完整代碼:
<span>npm install -g @angular/cli@latest </span>
>現在我們已經有了Apiservice,我們可以使用它來讓我們的TodoDataservice與我們的REST API後端進行通信。
更新tododataservice>讓我們的TodoDataservice與我們的REST API後端進行通信,我們必須注入新的Apiservice:
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
我們還更新了其方法,將所有工作委派給了Apiservice中的相應方法:
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve
我們的新方法實現看起來要簡單得多,因為數據邏輯現在由REST API後端處理。 但是,有一個重要的區別。舊方法包含同步代碼,並立即返回一個值。更新的方法包含異步代碼並返回可觀察的代碼。
><span>npm install json-server --save </span>這意味著我們還必須更新調用tododataservice方法的代碼,以正確處理可觀察物。
>更新AppComponent
當前,AppComponent期望TodoDataservice直接返回JavaScript對象和數組:
,但是我們的新Apiservice方法返回可觀察的。
如果我們當前在todos()中撥打tododataservice.getalltodos()方法:
<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>
tododataservice.getalltodos()方法調用相應的apiservice.getAllTodos()方法:
>此反過
但是,我們必須記住一件事!
<span>"scripts": { </span> <span>... </span> <span>"json-server": "json-server --watch db.json" </span><span>} </span>>
只要我們不訂閱可觀察到的可觀察到的返回:
<span>npm run json-server </span>沒有提出實際的HTTP請求。
>
要訂閱可觀察的可觀察,我們可以使用subscribe()方法,該方法採用三個參數:<span>\{^_^}/ hi! </span> Loading db.json Done Resources http://localhost:3000/todos Home http://localhost:3000
> onnext:可觀察到新值
時稱為一個函數
> onerror:可觀察到錯誤<span>// src/environments/environment.ts </span><span>// used when we run `ng serve` or `ng build` </span><span>export const environment = { </span> production<span>: false, </span> <span>// URL of development API </span> apiUrl<span>: 'http://localhost:3000' </span><span>}; </span>時稱為的函數
oncompleted:可觀察到的函數在可觀察到優雅終止時稱為。
>讓我們重寫我們當前的代碼:
現在,讓我們更新onaddtodo(todo)方法,也可以處理可觀察的響應:
<span>// src/environments/environment.prod.ts </span><span>// used when we run `ng serve --environment prod` or `ng build --environment prod` </span><span>export const environment = { </span> production<span>: true, </span> <span>// URL of production API </span> apiUrl<span>: 'http://localhost:3000' </span><span>}; </span>
>再次,我們使用subscribe()方法來訂閱this.tododataservice.addtodo(todo)的可觀察到的可觀察到的,當響應進來時,我們將新創建的todo添加到當前的todos列表中。 >
我們對其他方法重複相同的練習,直到我們的AppComponent看起來像這樣:
<span>npm install -g @angular/cli@latest </span>>
請注意,當您訂閱Angular HTTP服務返回的可觀察到的可觀察到的時,無需手動訂閱。 Angular將清理所有內容,以防止記憶洩漏。
>讓我們看看一切是否按預期工作。嘗試
打開一個終端窗口。從我們的應用程序目錄的根目錄中,啟動RELT API後端:
再次,從我們的應用程序目錄的根目錄中,服務角應用程序:
現在,將您的瀏覽器導航到http:// localhost:4200。
npm uninstall -g @angular/cli angular-cli npm cache clean <span>npm install -g @angular/cli@latest </span>
如果一切順利,您應該看到以下內容:
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git </span><span>cd angular-todo-app </span><span>git checkout part-2 </span><span>npm install </span>ng serve
如果您看到錯誤,則可以將代碼與GitHub上的工作版本進行比較。
太棒了!我們的應用程序現在正在與REST API後端進行通信!
>>側提示:如果要運行NPM運行json服務器,並且在同一終端中使用NG,則可以同時使用兩個命令,而無需打開多個終端窗口或選項卡。
運行我們的測試
打開第三個終端窗口。
再次,從應用程序目錄的根目錄中,運行單元測試:
>讓我們看看為什麼我們的測試失敗以及如何修復它們。
修復我們的單元測試
>大多數失敗的單元測試都與檢查數據處理有關。這些測試不再需要,因為現在我們的REST API後端而不是TodoDataService執行數據處理,因此,讓我們刪除過時的測試:
<span>npm install json-server --save </span>如果我們現在運行單元測試,我們會發現一個錯誤:
>
由於testbed.configuretestingmodule()創建了用於測試的臨時模塊,因此引發了錯誤。
要使噴油器意識到Apiservice,我們必須通過將Apiservice列為配置對像中的提供商,並將其傳遞給testbed.configuretestingmodule():>我們不希望我們的測試跑步者在運行單元測試時連接到真正的API,因此讓我們創建一個Apimockservice來模擬單元測試中的真實Apiservice。
創建一個apimockservice<span>{ </span> <span>"todos": [ </span> <span>{ </span> <span>"id": 1, </span> <span>"title": "Read SitePoint article", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"title": "Clean inbox", </span> <span>"complete": false </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"title": "Make restaurant reservation", </span> <span>"complete": false </span> <span>} </span> <span>] </span><span>} </span>
>讓我們使用Angular CLI生成新的Apimockservice: 這顯示了以下內容: 接下來,我們實現了與Apiservice相同的方法,但是我們讓這些方法返回模擬數據而不是做出HTTP請求: >現在我們有了Apimockservice服務,我們可以用Apimockservice在單位測試中代替Apiservice。
在提供商數組中,我們告訴注射器在請求apiservice時提供Apimockservice:
>
不用擔心是否配置測試模塊看起來有些不知所措。 >您可以在官方文檔中了解有關Angular應用程序的官方文檔中設置單元測試的更多信息。
然後,向注射器提供我們的模擬apiservice: 歡呼!我們所有的測試都通過: 要將我們的應用程序部署到生產環境中,我們現在可以運行: >
在第一篇文章中,我們學會瞭如何: >使用Angular Cli
<span>npm install -g @angular/cli@latest
</span>
npm uninstall -g @angular/cli angular-cli
npm cache clean
<span>npm install -g @angular/cli@latest
</span>
<span>git clone git@github.com:sitepoint-editors/angular-todo-app.git
</span><span>cd angular-todo-app
</span><span>git checkout part-2
</span><span>npm install
</span>ng serve
請注意,每種方法如何返回新的新模擬數據。這似乎有些重複,但這是一個很好的做法。如果一個單位測試會更改模擬數據,則更改將永遠不會影響另一個單元測試中的數據。
<span>npm install json-server --save
</span>
>
<span>{
</span> <span>"todos": [
</span> <span>{
</span> <span>"id": 1,
</span> <span>"title": "Read SitePoint article",
</span> <span>"complete": false
</span> <span>},
</span> <span>{
</span> <span>"id": 2,
</span> <span>"title": "Clean inbox",
</span> <span>"complete": false
</span> <span>},
</span> <span>{
</span> <span>"id": 3,
</span> <span>"title": "Make restaurant reservation",
</span> <span>"complete": false
</span> <span>}
</span> <span>]
</span><span>}
</span>
<span>"scripts": {
</span> <span>...
</span> <span>"json-server": "json-server --watch db.json"
</span><span>}
</span>
<span>npm run json-server
</span>
<span>\{^_^}/ hi!
</span>
Loading db.json
Done
Resources
http://localhost:3000/todos
Home
http://localhost:3000
<span>// src/environments/environment.ts
</span><span>// used when we run `ng serve` or `ng build`
</span><span>export const environment = {
</span> production<span>: false,
</span>
<span>// URL of development API
</span> apiUrl<span>: 'http://localhost:3000'
</span><span>};
</span>
我們已經成功地將Angular應用程序連接到了REST API後端。
<span>// src/environments/environment.prod.ts
</span><span>// used when we run `ng serve --environment prod` or `ng build --environment prod`
</span><span>export const environment = {
</span> production<span>: true,
</span>
<span>// URL of production API
</span> apiUrl<span>: 'http://localhost:3000'
</span><span>};
</span>
>我們還將生成的DIST目錄上傳到我們的託管服務器。那有多甜? 摘要
<span>import { environment } from 'environments/environment';
</span>
<span>// we can now access environment.apiUrl
</span><span>const API_URL = environment.apiUrl;
</span>
創建一個todo類來表示單個todos
>
在第四部分中,我們將介紹路由器和重構AppComponent,以使用路由器從後端獲取煙多。
>在第五部分中,我們將實施身份驗證以防止未經授權訪問我們的應用程序。
>本文是由Vildan Softic審查的。感謝SitePoint所有的同行評審器製作SitePoint內容的最佳功能!
>經常詢問有關Angular和RXJS API服務的問題(常見問題解答)> rxjs在Angular API服務中的作用是什麼?
rxjs,用於JavaScript的反應性擴展的縮寫,是一個用於使用可觀察力的反應性編程的庫,以使基於異步或回調更容易組成基於異步或回調的庫代碼。在Angular API服務的背景下,RXJS在處理異步操作中起著至關重要的作用。它提供了一種創建和使用可觀察到的方法,從而可以管理多個異步操作,處理錯誤,甚至取消操作。這使其成為使用HTTP請求的功能強大的工具,它們本質上是異步的。 > Angular如何與REST後端交互?我如何在Angular API服務中重試失敗的請求? ,您可以使用RXJS的操作員重試或重試失敗的請求。重試操作員重新提交可觀察到的,有效地重複HTTP請求。重試的操作員允許您定義重試該請求的條件。
以上是Angular和RXJS:添加REST API後端的詳細內容。更多資訊請關注PHP中文網其他相關文章!