Cliente http versátil, moderno y ligero basado en promesas.
npm i -S awi
< script src =" https://cdn.jsdelivr.net/npm/awi/dist/awi.js " > </ script >
Nodo | Cromo | Borde | Firefox | Ópera | Safari |
---|---|---|---|---|---|
6.13.0 | 52 | 17 | 29 | 19 | 10 |
Las solicitudes más básicas se pueden ejecutar sin problemas con Awi. Simplemente cree una nueva instancia y llame al método get
sugar con la URL deseada. Esta llamada devuelve una instancia de la interfaz Response
de Awi que tiene el cuerpo, el estado y los encabezados de la respuesta fácilmente accesibles.
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 funciona mejor cuando se usa en TypeScript, ya que puede escribir sugerencias en todas las respuestas y obtener comprobaciones de tipo y un agradable autocompletado desde su 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 proporciona azúcar de sintaxis para todos los métodos de solicitud básicos. Los ayudantes POST
, PUT
y PATCH
opcionalmente toman el cuerpo de la solicitud como 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 )
Al recibir un estado de respuesta de más de 400, Awi rechaza automáticamente la promesa para que no tenga que realizar comprobaciones arbitrarias del estado de la respuesta mediante declaraciones if
.
import { Awi } from 'awi'
await new Awi ( )
. post ( 'http://server.api/todos' , { completed : false } )
. catch ( response => console . assert ( response . status === 422 ) )
Awi también proporciona un asistente body
para evitar repetir la infame devolución de llamada de promesa .then(res => res.body)
. Este asistente acepta un tipo genérico para dar pistas sobre el cuerpo de la respuesta.
Tenga en cuenta que este asistente envía una solicitud
GET
de forma predeterminada. Si desea utilizar un método de solicitud diferente, el método debe especificarse mediante un interceptor.
Tenga en cuenta también que si se rechaza la promesa, se devuelve el objeto de respuesta completo.
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' )
Gracias a @bausano y su increíble paquete de estructuras de datos, Awi tiene un asistente optional
que devuelve el cuerpo de la respuesta como Optional<T>
en lugar de rechazar la promesa.
Tenga en cuenta que este asistente envía una solicitud
GET
de forma predeterminada. Si desea utilizar un método de solicitud diferente, el método debe especificarse mediante un interceptor.
También tenga en cuenta que si la solicitud falla debido a problemas de red o una mala configuración, la promesa aún se rechaza.
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 )
Los interceptores de solicitudes son lo que hace que Awi se destaque. Inspirado en Koa, Awi proporciona un método use
que acepta una devolución de llamada asincrónica que modifica el objeto de solicitud.
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 las propiedades que se pueden modificar en el objeto de solicitud están disponibles en la referencia de API de Awi.
Cada solicitud en Awi está definida de forma única por el conjunto de interceptores asignados a la solicitud. Todos los métodos de ayuda de Awi no son más que azúcar para asignar interceptores. Todas las solicitudes se pueden enviar sin utilizar los ayudantes mediante el 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 ) )
Aunque este enfoque es bastante extenso y el uso de ayudas es mucho más limpio, proporciona una forma sencilla de ampliar Awi y/o crear plantillas de solicitud.
Como puede ver, el concepto de interceptor proporciona una manera de crear plantillas de solicitud para su aplicación de una manera muy agradable y reutilizable. Esto puede resultar especialmente útil al realizar solicitudes 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 ) )
Toda la funcionalidad de Awi se resume en la página wiki.
es liviano
¡El tamaño del archivo minimizado es de 12kB y no pretendemos hacerlo más grande!
Está diseñado para desarrolladores, por desarrolladores.
Realizar solicitudes http es algo que todo desarrollador debe hacer a diario, especialmente cuando se trata de TypeScript o JavaScript. Awi tiene una base de código clara, está estrictamente tipificado y dejamos bloques de documentación en los archivos creados a propósito; de esta manera, puedes leer lo que hace cada método simplemente haciendo clic con Ctrl y clic en él.
es flexible
Puede optar por seguir el camino más fácil y utilizar los asistentes integrados de Awi para ejecutar su solicitud HTTP como una sola línea, o puede definir y extraer plantillas reutilizables para sus solicitudes desde cero.
Awi también es de código abierto, por lo que si te falta alguna característica que te haga la vida más fácil, no dudes en contribuir.
El patrón del interceptor está fuertemente inspirado en Koa, que también se utiliza para crear un servidor simulado para nuestras pruebas e2e.
La implementación de ejecutores tanto para web como para nodos está inspirada nada menos que en axios.
MIT