Conversation
sadcitizen
left a comment
There was a problem hiding this comment.
Идея с единым фасадом для axios и fetch мне нравится, но в текущей реализации сам сервис по сути ничего не делает, а вся логика лежит в контроллерах.
Хочется сначала собрать все варианты использования этого сервиса. Их много в наших проектах. И от них уже отталкиваться при разработке.
| @@ -0,0 +1,16 @@ | |||
| abstract class HttpRestController { | |||
There was a problem hiding this comment.
Для чего слово Rest в названии?
There was a problem hiding this comment.
Предполагалось что данная сущность будет рулить GET, POST, ..., запросами.
| @@ -0,0 +1,16 @@ | |||
| abstract class HttpRestController { | |||
| abstract get<R>(...args: any[]): Promise<R>; | |||
There was a problem hiding this comment.
Я бы у этих методов задал более жесткие контракты. У каждого метода есть url, есть параметры, у некоторых точно должно быть тело запроса или хотя бы null.
There was a problem hiding this comment.
Можно попробовать. В текущей реализции просто больше свободы
There was a problem hiding this comment.
Если нужна свобода, то тогда зачем типизация? Она ограничивает свободу.
| abstract patch<R>(...args: any[]): Promise<R>; | ||
| abstract put<R>(...args: any[]): Promise<R>; | ||
| abstract delete<R>(...args: any[]): Promise<R>; | ||
| public setHeader: (...args: any[]) => void; |
There was a problem hiding this comment.
А как мне задать baseUrl или timeout для запросов?
There was a problem hiding this comment.
Это можно добавить. Пока только напрямую через инстанс контроллера
| import { IHttpServiceOptions } from './httpService.types'; | ||
| import HttpRestController from './restController'; | ||
|
|
||
| class HttpService<RestController extends HttpRestController> { |
There was a problem hiding this comment.
Зачем нужна ещё одна сущность, если запросы можно контроллером дергать?
There was a problem hiding this comment.
Хотел сделать чтобы главный класс делал базовые штуки, по типу установки хэдеров, таймаутов, бейсурл, но в конечном счете, кажется, что действительно, проще через описанный класс контроллера это сделать =(
| this.axiosInstance.defaults.headers[key] = value; | ||
| }; | ||
|
|
||
| get = async <T, R = AxiosResponse<T>>(url: string, params: object = {}, options: object = {}): Promise<R> => { |
There was a problem hiding this comment.
Тут слабая типизация и тип AxiosResponse будет торчать наружу.
There was a problem hiding this comment.
Не понял проблемы
There was a problem hiding this comment.
Я этот подход взял с ЛМ АТ :)
| post = async <R = Response>(url: string, body: object, headers?: Headers): Promise<R> => { | ||
| return fetch(url, { | ||
| method: 'POST', | ||
| body: JSON.stringify(body), |
There was a problem hiding this comment.
body обязательный параметр
There was a problem hiding this comment.
Я могу методом post мутировать какое-то состояние на сервере, при этом в запросе не будет никакого тела. Например, запрос POST https://blablabla.com/things/1/do-something будет менять статус сущности согласно статусной модели, но в самом запросе нет тела.
|
Класс или тип ошибки тоже, кстати, можно свои определить. Можно учесть network error. |
Я не вижу как типы ошибок использовать в этом сервисе. Он больше про инфраструктурный сетап http пакетов. Например, если я буду использовать use-query от tanstack, то там в ответе можно добраться до кода ошибки, единственное, что он у них там не типизирован, там просто Number (во всяком случае, в тех версиях, которыми я пользовался) |
Думаю, можно убрать этот слой и оставить классы для fetch и axios'а. Пока не представляю для чего может HttpService понадобиться, как будто он излишен |
У тебя запрос может выполнится удачно или с ошибкой. То есть ошибка это результат вызова, почему её надо где-то отдельно держать? А тип ошибки это параметр самой ошибки. |
Нужно описать контракт сервиса, который бы покрыл большинство типовых сценариев. А сервисы на базе |
|
Я бы ещё переименовал пакет в |
|
Изучил как мы используем axios на наших проектах и есть ощущение, что в большинстве случаев его можно заменить на Список того что нам нужно:
|
@byndyusoft-ui/http-serviceInstallation
Usage
To start using this service you need to create a new class instance of HttpService and provide restController option.
There are two classes ready to be used as restControllers: HttpRestControllerFetch and HttpRestControllerAxios. For fetch and axios.
Example of usage with HttpRestControllerFetch
Example of usage with HttpRestControllerAxios
You can define own HttpRestController and pass it like this