基于 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 的启发。
麻省理工学院