Cliente http versátil, moderno e leve baseado em promessas.
npm i -S awi
< script src =" https://cdn.jsdelivr.net/npm/awi/dist/awi.js " > </ script >
Nó | Cromo | Borda | Firefox | Ópera | Safári |
---|---|---|---|---|---|
6.13.0 | 52 | 17 | 29 | 19 | 10 |
As solicitações mais básicas podem ser executadas perfeitamente com o Awi. Basta criar uma nova instância e chamar o método get
sugar com a URL desejada. Esta chamada retorna uma instância da interface Response
do Awi que possui o corpo, o status e os cabeçalhos da resposta facilmente acessíveis.
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 )
O Awi funciona melhor quando usado em TypeScript, pois você pode digitar todas as respostas e obter verificações de tipo e um ótimo preenchimento automático de seu 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 fornece sintaxe para todos os métodos básicos de solicitação. Os auxiliares POST
, PUT
e PATCH
opcionalmente usam o corpo da solicitação como seu segundo argumento.
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 )
Ao receber um status de resposta de mais de 400, o Awi rejeita automaticamente a promessa para que você não precise fazer verificações arbitrárias do status da resposta por meio de instruções if
.
import { Awi } from 'awi'
await new Awi ( )
. post ( 'http://server.api/todos' , { completed : false } )
. catch ( response => console . assert ( response . status === 422 ) )
Awi também fornece um ajudante body
para evitar a repetição do infame retorno de chamada da promessa .then(res => res.body)
. Este auxiliar aceita um tipo genérico para sugerir o tipo do corpo da resposta.
Observe que este auxiliar envia uma solicitação
GET
por padrão. Se você desejar usar um método de solicitação diferente, o método precisará ser especificado usando um interceptor.
Observe também que se a promessa for rejeitada, todo o objeto de resposta será retornado.
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' )
Graças ao @bausano e seu incrível pacote de estruturas de dados, Awi tem um auxiliar optional
que retorna o corpo da resposta como Optional<T>
em vez de rejeitar a promessa.
Observe que este auxiliar envia uma solicitação
GET
por padrão. Se você desejar usar um método de solicitação diferente, o método precisará ser especificado usando um interceptor.
Observe também que se a solicitação falhar devido a problemas de rede ou configuração incorreta, a promessa ainda será rejeitada.
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 )
Os interceptadores de solicitações são o que diferencia o Awi. Inspirado em Koa, Awi fornece um método use
que aceita um retorno de chamada assíncrono que modifica o objeto de solicitação.
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 ) )
Todas as propriedades que podem ser modificadas no objeto request estão disponíveis na referência da API do Awi.
Cada solicitação no Awi é definida exclusivamente pelo conjunto de interceptores atribuídos à solicitação. Todos os métodos auxiliares do Awi nada mais são do que um açúcar para atribuir interceptadores. Todas as solicitações podem ser enviadas sem usar os auxiliares por meio do método 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 ) )
Embora essa abordagem seja bastante demorada e o uso de helpers seja muito mais limpo, ela fornece uma maneira direta de estender o Awi e/ou criar modelos de solicitação.
Como você pode ver, o conceito de interceptor fornece uma maneira de criar modelos de solicitação para sua aplicação de uma forma muito agradável e reutilizável. Isto pode ser especialmente útil ao fazer solicitações autorizadas.
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 ) )
Todas as funcionalidades do Awi estão resumidas na página wiki.
É leve
O tamanho do arquivo reduzido é de 12kB e não pretendemos aumentá-lo!
Foi projetado para desenvolvedores, por desenvolvedores
Fazer solicitações http é algo que todo desenvolvedor precisa fazer diariamente, especialmente quando se trata de TypeScript ou JavaScript. Awi tem uma base de código bacana, é estritamente digitado e deixamos blocos de documentação propositalmente nos arquivos construídos - dessa forma, você pode ler o que cada método faz simplesmente clicando com a tecla Ctrl pressionada nele!
É flexível
Você pode optar pelo caminho mais fácil e usar os ajudantes integrados do Awi para executar sua solicitação HTTP como uma linha única, ou pode definir e extrair modelos reutilizáveis para suas solicitações do zero!
Awi também é de código aberto, então se você estiver faltando algum recurso que tornaria sua vida mais fácil, sinta-se à vontade para contribuir.
O padrão do interceptor é fortemente inspirado no Koa, que também é usado para criar um servidor simulado para nossos testes e2e.
A implementação de executores para web e nó é inspirada em nada menos que axios.
MIT