Используйте декораторы ECMAScript (в настоящее время предложение этапа 2) для выполнения HTTP-запросов и управления обработкой ответов. Это простой и понятный способ управления потоком данных через сетевой уровень вашего приложения.
Две основные части: декораторы методов, которые фактически выполняют запрос, и декораторы классов, которые позволят вам управлять способом преобразования и обработки ответов от сервера.
Самый простой пример — это просто выборка данных из конечной точки JSON:
import { get } from 'fitted' ;
class HackerNews {
@ get ( 'https://hacker-news.firebaseio.com/v0/topstories.json' )
topstories ( request , response ) {
return request ( { } , response ) ;
}
}
И извлеките:
const hackerNews = new HackerNews ( ) ;
const topstories = await hackerNews . topstories ( ) ;
console . log ( topstories ) ;
Основной запрос
Используя декоратор get
, вы можете вызвать запрос GET
:
import { get } from 'fitted' ;
class HackerNews {
@ get ( 'https://hacker-news.firebaseio.com/v0/topstories.json' )
topstories ( request , response ) {
return request ( { } , response ) ;
}
}
Объединение параметров
Чтобы объединить параметры с URL-адресом, мы используем шаблон URL-адреса, который использует фигурные скобки для инкапсуляции объединяемой переменной.
import { get } from 'fitted' ;
class HackerNews {
@ get ( 'https://hacker-news.firebaseio.com/v0/item/{id}.json' )
item ( id , request , response ) {
return request ( {
template : {
id : 123
}
} , response ) ;
}
}
Базовый URL
Большую часть времени ваши конечные точки будут использовать один и тот же базовый URL-адрес, поэтому Fitted позволяет вам установить базовый URL-адрес, который будет префиксом ко всем путям, установленным в декораторах вашего метода.
import { base , get } from 'fitted' ;
@ base ( 'https://hacker-news.firebaseio.com/v0/' )
class HackerNews {
@ get ( 'item/{id}.json' )
item ( id , request , response ) {
return request ( {
template : {
id : 123
}
} , response ) ;
}
}
Отправка данных
Чтобы добавить данные в ваш запрос на post
, put
и destroy
запросов и указать строку запроса для вашего запроса get
, вы добавляете объект data
в определение вашего запроса.
import { put } from 'fitted' ;
class HackerNews {
@ put ( 'https://hacker-news.firebaseio.com/v0/item/{id}.json' )
item ( id , name , request , response ) {
return request ( {
template : {
id : 123
} ,
data : {
name : name
}
} , response ) ;
}
}
Запросить украшение
Часто все конечные точки имеют одинаковые требования к запросам, требуя, например, чтобы у всех был установлен некоторый набор заголовков. Для этого можно использовать декоратор @request
. Он получит конфигурацию каждого переданного запроса перед передачей его драйверу.
import { get , request } from 'fitted' ;
const myRequestHandler = config => {
config . headers = {
'accept' : 'application/json'
}
return config ;
}
@ request ( myRequestHandler )
class HackerNews {
@ get ( 'item/{id}.json' )
item ( id , request , response ) {
return request ( {
template : {
id : id
}
} , response ) ;
}
}
Обработка ответов
Когда сервер отвечает заголовком Content-Type
содержащим application/json
Fitted автоматически передает его в функцию JSON.parse
, чтобы полученный Promise вывел соответствующий объект.
Любой другой Content-Type
приведет к возникновению ошибки и потребует от вас реализации собственного обработчика.
Пользовательский процессор ответов
Когда ваша конечная точка возвращает что-то, что требует некоторой предварительной обработки, вы можете определить процессор для всех конечных точек в определении вашего API. Он состоит из функции, которая получает ответ от сервера и передает проанализированные данные объекту ответа.
import { get , processor } from 'fitted' ;
const myProcessor = response => {
const data = JSON . parse ( response . getBody ( ) ) ;
response . setBody ( data ) ;
return data ;
}
@ processor ( myProcessor )
class HackerNews {
@ get ( 'item/{id}.json' )
item ( id , request , response ) {
return request ( {
template : {
id : id
}
} , response ) ;
}
}