what?ngify 比 axios 更好用,更強大?

文章目錄

  • 前言
  • 一、什么是ngify?
  • 二、npm安裝
  • 三、發起請求
    • 3.1 獲取 JSON 數據
    • 3.2 獲取其他類型的數據
    • 3.3 改變服務器狀態
    • 3.4 設置 URL 參數
    • 3.5 設置請求標頭
    • 3.6 與服務器響應事件交互
    • 3.7 接收原始進度事件
    • 3.8 處理請求失敗
    • 3.9 Http Observables
  • 四、更換 HTTP 請求實現
  • 五、XSRF/CSRF 防護
  • 六、全局配置
  • 七、基本用法
  • 八、攔截請求和響應
  • 九、測試請求
  • 十、支持


前言

這篇文章主要介紹了 @ngify/http 這一響應式 HTTP 客戶端,包括其與 axios 的關聯、功能特點、基本用法(如獲取不同類型數據、設置參數和標頭等)、攔截器的使用、更換請求實現、防護機制、全局配置及測試請求等,還對比了它與其他庫的差異,強調了其穩定性和便捷性。

在這里插入圖片描述


一、什么是ngify?

在前端開發中,使用最廣泛的 HTTP 客戶端為 axios,它是一個用于瀏覽器和 Node.js 的、基于 PromiseHTTP 客戶端。
axios 的前身其實是 AngularJS$http 服務。axios 深受 AngularJS 中提供的 $http 服務的啟發,將 $http 服務從 AngularJS 中剝離,提供一個獨立的服務,以便在 AngularJS 之外使用。

注:AngularJS 特指 AngularJS v1,而非 Angular 2+。

Angular2+ 拋棄了原有的 $http 服務,轉而與 RxJS 深度集成,打造了一個更加先進、現代化的響應式 HTTP 客戶端。這個新的客戶端充分利用了 RxJS 的強大功能,提供了更靈活、更易于理解的異步操作方式。然而,由于其與 Angular 的依賴注入和 SSR 功能緊密耦合,使得它無法直接應用于 Angular 生態之外。

@ngify/http 是一個基于 RxJS 的響應式 HTTP 客戶端,提供了與 Angular HttpClient 高度一致的 API,主要包含以下功能:

  • 請求類型化響應對象的能力。
  • 簡化的錯誤處理。
  • 請求和響應的攔截機制。
  • 輕松處理請求超時、重試、并發、緩存等等。
  • 支持多種平臺:Web、Node.js、微信小程序、uni-app、taro 等等。

@ngify/http 的目標與 axios 一致:提供一個獨立的 HTTP 服務,以便在 Angular2+ 之外使用。

💯無需擔心 @ngify/http 的穩定性,@ngify/http 采用了與 Angular HttpClient 相同的嚴格單元測試,確保了其代碼質量和可靠性,在各種場景下保持足夠的穩定性。

二、npm安裝

npm install @ngify/http

三、發起請求

HttpClient 具有與用于發出請求的不同 HTTP 動詞相對應的方法,這些方法既可以加載數據,也可以在服務器上應用變更。每個方法都返回一個 RxJS Observable,訂閱后會發送請求,然后在服務器響應時發出結果。

由 HttpClient 創建的 Observable 可以被訂閱任意多次,并且每次訂閱都會發出一個新的后端請求。

通過傳遞給請求方法的選項對象,可以調整請求的各種屬性和返回的響應類型。

3.1 獲取 JSON 數據

從后端獲取數據通常需要使用 HttpClient.get() 方法發出 GET 請求。此方法采用兩個參數:要從中獲取的字符串端點 URL,以及用于配置請求的可選選項對象。

例如,要使用 HttpClient.get() 方法從假設的 API 獲取配置數據:

http.get<Config>('/api/config').subscribe(config => {// process the configuration.
});

請注意泛型類型參數,它指定服務器返回的數據的類型為 Config 。該參數是可選的,如果省略它,則返回的數據將具有 any 類型。

🎯 注意: 如果數據具有未知形狀的類型,那么更安全的方法是使用 unknown 作為響應類型。

請求方法的通用類型是關于服務器返回的數據的類型斷言。 HttpClient 不會驗證實際返回數據是否與該類型匹配。

3.2 獲取其他類型的數據

默認情況下, HttpClient 假定服務器將返回 JSON 數據。與非 JSON API 交互時,您可以告訴 HttpClient 在發出請求時期望并返回什么響應類型。這是通過 responseType 選項完成的。

Response typeReturned response type
‘json’ (默認)給定泛型類型的 JSON 數據
‘text’字符串文本
‘blob’Blob 實例
‘arraybuffer’包含原始響應字節的 ArrayBuffer

例如,您可以要求 HttpClient 將 .jpeg 圖像的原始字節下載到 ArrayBuffer 中:

http.get('/images/dog.jpg', { responseType: 'arraybuffer' }).subscribe(buffer => {console.log('The image is ' + buffer.byteLength + ' bytes large');
});

3.3 改變服務器狀態

執行修改的服務器 API 通常需要發出 POST 請求,并在請求正文中指定新狀態或要進行的更改。

HttpClient.post() 方法的行為與 get() 類似,只是第二位參數變為 body 參數:

http.post<Config>('/api/config', newConfig).subscribe(config => {console.log('Updated config:', config);
});

可以提供許多不同類型的值作為請求的 body,并且 HttpClient 將相應地序列化它們:

BodytypeSerialization as
string純文本
number、boolean、Array 或 objectJSON 字符串
ArrayBuffer來自 buffer 的原始數據
Blob具有 Blob 內容類型的原始數據
FormDatamultipart/form-data 表單數據
HttpParams 或 URLSearchParamsapplication/x-www-form-urlencoded 格式化字符串

3.4 設置 URL 參數

使用 params 選項指定應包含在請求 URL 中的請求參數。

傳遞字面量對象是配置 URL 參數的最簡單方法:

http.get('/api/config', {params: { filter: 'all' },
}).subscribe(config => {// ...
});http.post('/api/config', body, {params: { filter: 'all' },
}).subscribe(config => {// ...
});

或者,如果您需要對參數的構造或序列化進行更多控制,則可以傳遞 HttpParams 的實例。

🎯注意: HttpParams 的實例是不可變的,不能直接更改。相反,諸如 append() 之類的可變方法會返回應用了變更的 HttpParams 的新實例。

const baseParams = new HttpParams().set('filter', 'all');http.get('/api/config', {params: baseParams.set('details', 'enabled')
}).subscribe(config => {// ...
});http.post('/api/config', body, {params: baseParams.set('details', 'enabled')
}).subscribe(config => {// ...
});

您可以使用自定義 HttpParameterCodec 實例化 HttpParams(構造方法中的第二個參數),該自定義 HttpParameterCodec確定HttpClient` 如何將參數編碼到 URL 中。

3.5 設置請求標頭

使用 headers 選項指定應包含在請求中的請求標頭。

傳遞字面量對象是配置請求標頭的最簡單方法:

http.get('/api/config', {headers: {'X-Debug-Level': 'verbose',}
}).subscribe(config => {// ...
});

或者,如果您需要對標頭的構造進行更多控制,請傳遞 HttpHeaders 的實例。

🎯注意: HttpHeaders 的實例是不可變的,不能直接更改。相反,諸如 append() 之類的可變方法會返回應用了變更的 HttpHeaders 的新實例。

const baseHeaders = new HttpHeaders().set('X-Debug-Level', 'minimal');http.get<Config>('/api/config', {headers: baseHeaders.set('X-Debug-Level', 'verbose'),
}).subscribe(config => {// ...
});

3.6 與服務器響應事件交互

為了方便起見,HttpClient 默認返回服務器返回的數據的 Observable(body)。有時需要檢查實際響應,例如檢索特定的響應標頭。

要訪問整個響應,請將 observe 選項設置為 'response'

http.get<Config>('/api/config', { observe: 'response' }).subscribe(res => {console.log('Response status:', res.status);console.log('Body:', res.body);
});

3.7 接收原始進度事件

除了響應正文或響應對象之外,HttpClient 還可以返回與請求生命周期中的特定時刻相對應的原始事件流。這些事件包括何時發送請求、何時返回響應標頭以及何時完成正文。這些事件還可以包括報告大型請求或響應正文的上傳和下載狀態的進度事件。

默認情況下,進度事件處于禁用狀態(因為它們會產生性能成本),但可以使用 reportProgress 選項來啟用。

🎯注意:HttpClientfetch 實現不支持報告上傳進度事件。

要觀察事件流,請將 observe 選項設置為 'events'

http.post('/api/upload', myData, {reportProgress: true,observe: 'events',
}).subscribe(event => {switch (event.type) {case HttpEventType.UploadProgress:console.log('Uploaded ' + event.loaded + ' out of ' + event.total + ' bytes');break;case HttpEventType.Response:console.log('Finished uploading!');break;}
});

事件流中報告的每個 HttpEvent 都有一個 type 來區分事件所代表的內容:
在這里插入圖片描述

3.8 處理請求失敗

HTTP 請求失敗有兩種情況:

  • 網絡或連接錯誤可能會阻止請求到達后端服務器。
  • 后端可以收到請求但無法處理,并返回錯誤響應。

HttpClientHttpErrorResponse 中捕獲這兩種錯誤,并通過 Observable 的錯誤通道返回該錯誤。網絡錯誤的 status 代碼為 0,errorProgressEvent 的實例。
后端錯誤具有后端返回的失敗 status 代碼,以及錯誤響應 error。檢查響應以確定錯誤的原因以及處理錯誤的適當操作。

RxJS 提供了多個可用于錯誤處理的運算符。

您可以使用 catchError 運算符將錯誤響應轉換為 UI 的值。該值可以告訴 UI 顯示錯誤頁面或值,并在必要時捕獲錯誤原因。

有時,諸如網絡中斷之類的暫時性錯誤可能會導致請求意外失敗,只需重試請求即可使其成功。RxJS 提供了幾個重試運算符,它們在某些條件下自動重新訂閱失敗的 Observable。例如,retry() 運算符將自動嘗試重新訂閱指定的次數。

3.9 Http Observables

HttpClient 上的每個請求方法都會構造并返回所請求響應類型的 Observable。使用 HttpClient 時,了解這些 Observable 的工作原理非常重要。
HttpClient 生成 RxJS 所謂的 “冷” Observable,這意味著在訂閱 Observable之前不會發生任何實際請求。只有這樣,請求才真正發送到服務器。多次訂閱同一個 Observable會觸發多個后端請求。每個訂閱都是獨立的。
一旦響應返回,來自 HttpClientObservable通常會自動完成(盡管攔截器會影響這一點)。
由于自動完成,如果不清理 HttpClient訂閱,通常不存在內存泄漏的風險。

四、更換 HTTP 請求實現

@ngify/http 內置了以下 HTTP 請求實現:

HTTP請求實現描述
withXhr@ngify/http使用 XMLHttpRequest 進行 HTTP 請求
withFetch@ngify/http使用 Fetch API 進行 HTTP 請求
withWx@ngify/http-wx在 微信小程序 中進行 HTTP 請求
withTaro@ngify/http-taro在 Taro 中進行 HTTP 請求
withUni@ngify/http-uni在 Uni-app 中進行 HTTP 請求

HttpClient 默認使用 withXhr,您可以自行切換到其他實現:

import { withXhr, withFetch } from '@ngify/http';
import { withWx } from '@ngify/http-wx';const xhrHttp = new HttpClient(withXhr()
);
const fetchHttp = new HttpClient(withFetch()
);
const wxHttp = new HttpClient(withWx()
);

你還可使用自定義的 HttpBackend 實現:

// 需要實現 HttpBackend 接口
class CustomHttpBackend implements HttpBackend {handle(request: HttpRequest<any>): Observable<HttpEvent<any>> {// ...}
}const customHttp = new HttpClient({kind: HttpFeatureKind.Backend,value: new CustomHttpBackend()}
);

五、XSRF/CSRF 防護

HttpClient 支持用于防止 XSRF 攻擊的通用機制。執行 HTTP 請求時,攔截器從 cookie 中讀取令牌(默認為 XSRF-TOKEN),并將其設置為 HTTP 標頭(默認為 X-XSRF-TOKEN)。
由于只有在您的域上運行的代碼才能讀取 cookie,因此后端可以確定 HTTP 請求來自您的客戶端應用程序而不是攻擊者。

要啟用 XSRF 防護,請在 HttpClient 實例化時或在 setupHttpClient 中傳遞 withXsrfProtection()

const http = new HttpClient(withXsrfProtection()
);

如果您的后端服務對 XSRF 令牌 cookie 或標頭使用不同的名稱,請自定義 cookie 名稱與標頭名稱:

withXsrfProtection({cookieName: 'CUSTOM_XSRF_TOKEN',headerName: 'X-Custom-Xsrf-Header',
});

默認情況下,攔截器會在除 GET/HEAD 外的所有請求(例如 POST)上將此標頭發送到相對 URL,但不會在具有絕對 URL 的請求上發送此標頭。

為什么不保護 GET 請求?

僅對于可以更改后端狀態的請求才需要 CSRF 保護。就其本質而言,CSRF 攻擊跨越域邊界,并且 Web 的同源策略將阻止攻擊頁面檢索經過身份驗證的 GET 請求的結果。

為了利用這一點,您的服務器需要在頁面加載或第一個 GET 請求時在名為 XSRF-TOKENcookie 中設置一個令牌。
在后續請求中,服務器可以驗證 cookie 是否與 X-XSRF-TOKEN HTTP 標頭匹配,因此確保只有在您的域上運行的代碼才能發送請求。
令牌對于每個用戶必須是唯一的,并且必須可由服務器驗證;這可以防止客戶端創建自己的令牌。

HttpClient 僅支持 XSRF 保護方案的客戶端部分

您的后端服務必須配置為為您的頁面設置 cookie,并驗證標頭是否存在于所有符合條件的請求中。如果不這樣做,HttpClient 的 XSRF 保護就會失效。

六、全局配置

您可以使用 setupHttpClient 函數進行全局配置:

setupHttpClient(withFetch(),withXsrfProtection(),
);

七、基本用法

待續

八、攔截請求和響應

請移步:ngify 攔截請求和響應

九、測試請求

參考 angular.dev/guide/http/…

十、支持

對 @ngify/http 感興趣?為該項目點星?!@ngify/http


在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66019.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66019.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66019.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux Kernel 之十 詳解 PREEMPT_RT、Xenomai 的架構、源碼、構建及使用

概述 現在的 RTOS 基本可以分為 Linux 陣營和非 Linux 陣營這兩大陣營。非 Linux 陣營的各大 RTOS 都是獨立發展,使用上也相對獨立;而 Linux 陣營則有多種不同的實現方法來改造 Linux 以實現實時性要求。本文我們重點關注 Linux 陣營的實時內核實現方法! 本文我們重點關注 …

【拒絕算法PUA】3065. 超過閾值的最少操作數 I

系列文章目錄 【拒絕算法PUA】0x00-位運算 【拒絕算法PUA】0x01- 區間比較技巧 【拒絕算法PUA】0x02- 區間合并技巧 【拒絕算法PUA】0x03 - LeetCode 排序類型刷題 【拒絕算法PUA】LeetCode每日一題系列刷題匯總-2025年持續刷新中 C刷題技巧總結&#xff1a; [溫習C/C]0x04 刷…

ClickHouse-CPU、內存參數設置

常見配置 1. CPU資源 1、clickhouse服務端的配置在config.xml文件中 config.xml文件是服務端的配置&#xff0c;在config.xml文件中指向users.xml文件&#xff0c;相關的配置信息實際是在users.xml文件中的。大部分的配置信息在users.xml文件中&#xff0c;如果在users.xml文…

《自動駕駛與機器人中的SLAM技術》ch9:自動駕駛車輛的離線地圖構建

目錄 1 點云建圖的流程 2 前端實現 2.1 前端流程 2.2 前端結果 3 后端位姿圖優化與異常值剔除 3.1 兩階段優化流程 3.2 優化結果 ① 第一階段優化結果 ② 第二階段優化結果 4 回環檢測 4.1 回環檢測流程 ① 遍歷第一階段優化軌跡中的關鍵幀。 ② 并發計算候選回環對…

type 屬性的用途和實現方式(圖標,表單,數據可視化,自定義組件)

1.圖標類型 <uni-icon>組件中&#xff0c;type可以用來指定圖標的不同樣式。 <uni-icons type"circle" size"30" color"#007aff"></uni-icons> //表示圓形 <uni-icons type"square" size"30" co…

網絡基礎知識指南|1-20個

1. IP地址: 即互聯網協議地址&#xff0c;是用于標識互聯網上的每一個設備或節點的唯一地址。IP地址的作用主要是進行網絡設備的定位和路由&#xff0c;確保數據包可以從源設備準確地傳送到目標設備。2. 子網掩碼: 是用于將一個IP地址劃分為網絡地址和主機地址的工具。它通常與…

GPT 系列論文精讀:從 GPT-1 到 GPT-4

學習 & 參考資料 前置文章 Transformer 論文精讀 機器學習 —— 李宏毅老師的 B 站搬運視頻 自監督式學習(四) - GPT的野望[DLHLP 2020] 來自獵人暗黑大陸的模型 GPT-3 論文逐段精讀 —— 沐神的論文精讀合集 GPT&#xff0c;GPT-2&#xff0c;GPT-3 論文精讀【論文精讀】…

lombok在高版本idea中注解不生效的解決

環境&#xff1a; IntelliJ IDEA 2024.3.1.1 Spring Boot Maven 問題描述 使用AllArgsConstructor注解一個用戶類&#xff0c;然后調用全參構造方法創建對象&#xff0c;出現錯誤&#xff1a; java: 無法將類 com.itheima.pojo.User中的構造器 User應用到給定類型; 需要:…

145.《redis原生超詳細使用》

文章目錄 什么是redisredis 安裝啟動redis數據類型redis key操作key 的增key 的查key 的改key 的刪key 是否存在key 查看所有key 「設置」過期時間key 「查看」過期時間key 「移除」過期時間key 「查看」數據類型key 「匹配」符合條件的keykey 「移動」到其他數據庫 redis數據類…

大數據技術Kafka詳解 ⑤ | Kafka中的CAP機制

目錄 1、分布式系統當中的CAP理論 1.1、CAP理論 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP機制 C軟件異常排查從入門到精通系列教程&#xff08;核心精品專欄&#xff0c;訂閱量已達600多個&#xff0c;歡迎訂閱&#xff0c;持續更新…

riscv架構下linux4.15實現early打印

在高版本linux6.12.7源碼中&#xff0c;early console介紹&#xff0c;可參考《riscv架構下linux6.12.7實現early打印》文章。 1 什么是early打印 適配內核到新的平臺&#xff0c;基本環境搭建好之后&#xff0c;首要的就是要調通串口&#xff0c;方便后面的信息打印。 正常流…

improve-gantt-elastic(vue2中甘特圖實現與引入)

1.前言 項目開發中需要使用甘特圖展示項目實施進度&#xff0c;左側為表格計劃&#xff0c;右側為圖表進度展示。wl-gantt-mater&#xff0c;dhtmlx嘗試使用過可拓展性受到限制。gantt-elastic相對簡單&#xff0c;可操作性強&#xff0c;基礎版本免費。 甘特圖&#xff08;Gan…

力扣 全排列

回溯經典例題。 題目 通過回溯生成所有可能的排列。每次遞歸時&#xff0c;選擇一個數字&#xff0c;直到選滿所有數字&#xff0c;然后記錄當前排列&#xff0c;回到上層時移除最后選的數字并繼續選擇其他未選的數字。每次遞歸時&#xff0c;在 path 中添加一個新的數字&…

1/13+2

運算符重載 myString.h #ifndef MYSTRING_H #define MYSTRING_H #include <cstring> #include <iostream> using namespace std; class myString {private:char *str; //記錄c風格的字符串int size; //記錄字符串的實際長度int capacity; …

04.計算機體系三層結構與優化(操作系統、計算機網絡、)

3.計算機體系三層結構與優化&#xff08;day04&#xff09; 3.1 操作系統 內容概要&#xff1a; 操作系統的發展史&#xff1a;批處理系統》分時操作系統》unix>linux多道技術》&#xff08;進程、線程&#xff09;并發進程與線程相關概念任務運行的三種狀態&#xff1a;…

【HM-React】08. Layout模塊

基本結構和樣式reset 結構創建 實現步驟 打開 antd/Layout 布局組件文檔&#xff0c;找到示例&#xff1a;頂部-側邊布局-通欄拷貝示例代碼到我們的 Layout 頁面中分析并調整頁面布局 代碼實現 pages/Layout/index.js import { Layout, Menu, Popconfirm } from antd impor…

計算機視覺算法實戰——實時車輛檢測和分類(主頁有相關源碼)

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ? ?????????????????? 1. 領域介紹?? 實時車輛檢測和分類是計算機視覺中的一個重要應用領域&#xff0c;旨在從視頻流或…

使用 selenium-webdriver 開發 Web 自動 UI 測試程序

優缺點 優點 有時候有可能一個改動導致其他的地方的功能失去效果&#xff0c;這樣使用 Web 自動 UI 測試程序可以快速的檢查并定位問題&#xff0c;節省大量的人工驗證時間 缺點 增加了維護成本&#xff0c;如果功能更新過快或者技術更新過快&#xff0c;維護成本也會隨之提高…

性能測試工具Jmeter分布式運行

性能測試工具JMeter的分布式執行是一種用于增強壓力測試能力的技術方案&#xff0c;它允許用戶通過多臺機器來共同完成同一個測試計劃的執行。這種方式特別適用于需要模擬成百上千甚至上萬用戶并發訪問的情況&#xff0c;當單臺機器由于硬件資源&#xff08;如CPU、內存、網絡I…

彌散張量分析開源軟件 DSI Studio 簡體中文漢化版可以下載了

網址&#xff1a; (63條消息) DSIStudio簡體中文漢化版(2022年7月)-算法與數據結構文檔類資源-CSDN文庫