基於 Promise 的多功能、現代且輕量級的 http 用戶端。
npm i -S awi
< script src =" https://cdn.jsdelivr.net/npm/awi/dist/awi.js " > </ script >
節點 | 鉻合金 | 邊緣 | 火狐瀏覽器 | 歌劇 | 狩獵之旅 |
---|---|---|---|---|---|
6.13.0 | 52 | 17 號 | 29 | 19 | 10 |
最基本的請求可以使用 Awi 無縫執行。只需建立一個新實例並使用所需的 URL 呼叫get
Sugar 方法即可。此呼叫傳回 Awi 的Response
介面的實例,該實例具有可輕鬆存取的回應正文、狀態和標頭。
import { Awi , Response } from 'awi'
const response : Response = await new Awi ( )
. get ( 'http://server.api/todos' )
console . assert ( typeof response . body === 'object' )
console . assert ( typeof response . headers === 'object' )
console . assert ( response . status === 200 )
Awi 在 TypeScript 中使用時效果最佳,因為您可以對所有回應進行類型提示,並從 IDE 進行類型檢查和良好的自動完成功能。
import { Awi , Response } from 'awi'
interface TodoResponse extends Response {
body : { title : string , completed : boolean }
}
const response : Response = await new Awi ( )
. get < TodoResponse > ( 'http://server.api/todos/1' )
console . assert ( typeof response . body . title === 'string' )
console . assert ( typeof response . body . completed === 'boolean' )
Awi 為所有基本請求方法提供語法糖。 POST
、 PUT
和PATCH
幫助程式可以選擇將請求正文作為第二個參數。
import { Awi , Response } from 'awi'
const response : Response = await new Awi ( )
. post ( 'http://server.api/todos' , { title : 'Start using Awi.' , completed : true } )
console . assert ( response . status === 201 )
收到 400+ 回應狀態後,Awi 會自動拒絕承諾,這樣您就不必透過if
語句對回應狀態進行任意檢查。
import { Awi } from 'awi'
await new Awi ( )
. post ( 'http://server.api/todos' , { completed : false } )
. catch ( response => console . assert ( response . status === 422 ) )
Awi 還提供了一個body
幫助器,以避免重複臭名昭著的.then(res => res.body)
承諾回調。此幫助器接受通用類型來對回應正文進行類型提示。
請注意,此幫助程式預設發送
GET
請求。如果您希望使用不同的請求方法,則需要使用攔截器來指定該方法。
另請注意,如果承諾被拒絕,則會傳回整個回應對象。
import { Awi } from 'awi'
interface Todo {
title : string
completed : boolean
}
const todo : Todo = await new Awi ( )
. body < Todo > ( 'http://server.api/todos/1' )
console . assert ( typeof todo . title === 'string' )
console . assert ( typeof todo . completed === 'boolean' )
感謝@bausano 和他出色的資料結構包,Awi 有一個optional
幫助器,它以Optional<T>
形式傳回回應的正文,而不是拒絕承諾。
請注意,此幫助程式預設發送
GET
請求。如果您希望使用不同的請求方法,則需要使用攔截器來指定該方法。
另請注意,如果請求因網路問題或配置錯誤而失敗,則承諾仍會被拒絕。
import { Awi , Optional } from 'awi'
interface Todo {
title : string
completed : boolean
}
const todo : Optional < Todo > = await new Awi ( )
. optional < Todo > ( 'http://server.api/todos/1' )
console . assert ( todo instanceof Optional )
請求攔截器是 Awi 脫穎而出的原因。受 Koa 的啟發,Awi 提供了一個use
方法,該方法接受修改請求物件的非同步回呼。
import { Awi , Response } from 'awi'
const response : Response = await new Awi ( )
. use ( async req => req . base = 'http://server.api' )
. use ( async req => req . path = 'todos' )
. get ( )
console . assert ( response . status === 200 ) )
Awi 的 API 參考中提供了可以在請求物件上修改的所有屬性。
Awi 中的每個請求都由指派給該要求的攔截器陣列唯一定義。所有 Awi 的輔助方法只不過是分配攔截器的糖。所有請求都可以透過send
方法發送,而無需使用助手。
import { Awi , Method , Response } from 'awi'
const response : Response = await new Awi ( )
. use ( async req => req . base = 'http://server.api' )
. use ( async req => req . path = 'todos' )
. use ( async req => req . method = Method . GET )
. send ( )
console . assert ( response . status === 200 ) )
儘管這種方法相當長且使用幫助程式更簡潔,但它提供了一種擴展 Awi 和/或建立請求範本的直接方法。
正如您所看到的,攔截器概念提供了一種以非常好的且可重複使用的方式為您的應用程式建立請求範本的方法。這在發出授權請求時特別有用。
import { Awi , Response } from 'awi'
// Define the template to be reused.
const auth = ( ) => new Awi ( )
. use ( async req => req . base = 'http://server.api' )
. use ( async req => req . headers [ 'authorization' ] = `Bearer ${ localStorage . token } ` )
// Use the template and provide further parameters.
const response : Response = await auth ( )
. get ( 'user' )
console . assert ( response . status === 200 ) )
Awi 的所有功能都在 wiki 頁面上進行了總結。
它很輕
縮小後的檔案大小為 12kB,我們不打算將其增大!
它是為開發人員設計的,由開發人員設計的
發出 http 請求是每個開發人員每天都需要做的事情,尤其是在涉及 TypeScript 或 JavaScript 時。 Awi 擁有簡潔的程式碼庫,類型嚴格,我們有意將文件區塊保留在建置的檔案中 - 這樣,您只需按住 Ctrl 鍵單擊即可了解每個方法的作用!
它很靈活
您可以選擇採用簡單的方法並使用 Awi 的內建幫助程式作為單行執行您的 HTTP 請求,也可以從頭開始為您的請求定義和提取可重複使用範本!
Awi 也是開源的,因此如果您缺少任何可以讓您的生活更輕鬆的功能,請隨時做出貢獻。
攔截器模式很大程度上受到 Koa 的啟發,它也用於為我們的 e2e 測試創建模擬伺服器。
Web 和 Node 執行器的實作都受到了 axios 的啟發。
麻省理工學院