@dxtmisha/wiki 0.39.6 → 0.39.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/defineProperty-Bjg6wMoX.js +39 -0
- package/dist/library.d.ts +0 -1
- package/dist/library.js +25 -25
- package/dist/media.js +12 -0
- package/dist/storybook.js +26929 -11
- package/package.json +1 -1
- package/src/library.ts +0 -1
- package/src/media/functional/functional-basic/api/api.en.mdx +45 -0
- package/src/media/functional/functional-basic/api/api.ru.mdx +45 -0
- package/src/media/functional/functional-basic/api/api.vi.mdx +45 -0
- package/src/media/functional/functional-basic/classes/Api/Api.en.mdx +54 -54
- package/src/media/functional/functional-basic/classes/Api/Api.ru.mdx +54 -54
- package/src/media/functional/functional-basic/classes/Api/Api.vi.mdx +54 -54
- package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.en.mdx +111 -0
- package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.ru.mdx +111 -0
- package/src/media/functional/functional-basic/classes/ApiCache/ApiCache.vi.mdx +111 -0
- package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.en.mdx +32 -0
- package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.ru.mdx +32 -0
- package/src/media/functional/functional-basic/classes/ApiDataReturn/ApiDataReturn.vi.mdx +32 -0
- package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.en.mdx +24 -28
- package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.ru.mdx +24 -28
- package/src/media/functional/functional-basic/classes/ApiDefault/ApiDefault.vi.mdx +24 -28
- package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.en.mdx +28 -14
- package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.ru.mdx +33 -19
- package/src/media/functional/functional-basic/classes/ApiHeaders/ApiHeaders.vi.mdx +33 -19
- package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.en.mdx +56 -0
- package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.ru.mdx +56 -0
- package/src/media/functional/functional-basic/classes/ApiHydration/ApiHydration.vi.mdx +55 -0
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.en.mdx +101 -49
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.ru.mdx +101 -49
- package/src/media/functional/functional-basic/classes/ApiInstance/ApiInstance.vi.mdx +98 -47
- package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.en.mdx +44 -26
- package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.ru.mdx +45 -27
- package/src/media/functional/functional-basic/classes/ApiPreparation/ApiPreparation.vi.mdx +44 -26
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.en.mdx +50 -21
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.ru.mdx +54 -25
- package/src/media/functional/functional-basic/classes/ApiResponse/ApiResponse.vi.mdx +55 -26
- package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.en.mdx +29 -32
- package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.ru.mdx +33 -36
- package/src/media/functional/functional-basic/classes/ApiStatus/ApiStatus.vi.mdx +33 -36
- package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.en.mdx +34 -53
- package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.ru.mdx +33 -52
- package/src/media/functional/functional-basic/classes/BroadcastMessage/BroadcastMessage.vi.mdx +39 -58
- package/src/media/functional/functional-basic/classes/Cache/Cache.en.mdx +7 -4
- package/src/media/functional/functional-basic/classes/Cache/Cache.ru.mdx +7 -4
- package/src/media/functional/functional-basic/classes/Cache/Cache.vi.mdx +28 -25
- package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.en.mdx +45 -53
- package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.ru.mdx +46 -54
- package/src/media/functional/functional-basic/classes/CacheItem/CacheItem.vi.mdx +47 -55
- package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.en.mdx +13 -1
- package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.ru.mdx +13 -1
- package/src/media/functional/functional-basic/classes/CacheStatic/CacheStatic.vi.mdx +13 -0
- package/src/media/functional/functional-basic/classes/Cookie/Cookie.en.mdx +88 -44
- package/src/media/functional/functional-basic/classes/Cookie/Cookie.ru.mdx +88 -44
- package/src/media/functional/functional-basic/classes/Cookie/Cookie.vi.mdx +85 -41
- package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.en.mdx +43 -22
- package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.ru.mdx +46 -25
- package/src/media/functional/functional-basic/classes/CookieBlock/CookieBlock.vi.mdx +43 -22
- package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.en.mdx +84 -0
- package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.ru.mdx +84 -0
- package/src/media/functional/functional-basic/classes/CookieBlockInstance/CookieBlockInstance.vi.mdx +100 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.en.mdx +153 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.ru.mdx +153 -0
- package/src/media/functional/functional-basic/classes/CookieStorage/CookieStorage.vi.mdx +153 -0
- package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.en.mdx +32 -25
- package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.ru.mdx +32 -25
- package/src/media/functional/functional-basic/classes/DataStorage/DataStorage.vi.mdx +32 -27
- package/src/media/functional/functional-basic/classes/Datetime/Datetime.en.mdx +36 -4
- package/src/media/functional/functional-basic/classes/Datetime/Datetime.ru.mdx +36 -4
- package/src/media/functional/functional-basic/classes/Datetime/Datetime.vi.mdx +36 -4
- package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.en.mdx +101 -70
- package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.ru.mdx +100 -69
- package/src/media/functional/functional-basic/classes/ErrorCenter/ErrorCenter.vi.mdx +101 -70
- package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.en.mdx +46 -42
- package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.ru.mdx +46 -42
- package/src/media/functional/functional-basic/classes/ErrorCenterHandler/ErrorCenterHandler.vi.mdx +46 -42
- package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.en.mdx +44 -96
- package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.ru.mdx +44 -96
- package/src/media/functional/functional-basic/classes/ErrorCenterInstance/ErrorCenterInstance.vi.mdx +44 -96
- package/src/media/functional/functional-basic/classes/EventItem/EventItem.en.mdx +49 -28
- package/src/media/functional/functional-basic/classes/EventItem/EventItem.ru.mdx +21 -0
- package/src/media/functional/functional-basic/classes/EventItem/EventItem.vi.mdx +63 -42
- package/src/media/functional/functional-basic/classes/Formatters/Formatters.en.mdx +97 -109
- package/src/media/functional/functional-basic/classes/Formatters/Formatters.ru.mdx +86 -98
- package/src/media/functional/functional-basic/classes/Formatters/Formatters.vi.mdx +99 -111
- package/src/media/functional/functional-basic/classes/Geo/Geo.en.mdx +3 -3
- package/src/media/functional/functional-basic/classes/Geo/Geo.ru.mdx +5 -5
- package/src/media/functional/functional-basic/classes/Geo/Geo.vi.mdx +5 -5
- package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.en.mdx +83 -40
- package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.ru.mdx +83 -40
- package/src/media/functional/functional-basic/classes/GeoFlag/GeoFlag.vi.mdx +87 -44
- package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.en.mdx +81 -0
- package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.ru.mdx +81 -0
- package/src/media/functional/functional-basic/classes/GeoInstance/GeoInstance.vi.mdx +81 -0
- package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.en.mdx +56 -105
- package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.ru.mdx +53 -102
- package/src/media/functional/functional-basic/classes/GeoPhone/GeoPhone.vi.mdx +55 -105
- package/src/media/functional/functional-basic/classes/Hash/Hash.en.mdx +18 -7
- package/src/media/functional/functional-basic/classes/Hash/Hash.ru.mdx +18 -7
- package/src/media/functional/functional-basic/classes/Hash/Hash.vi.mdx +18 -7
- package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.en.mdx +54 -0
- package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.ru.mdx +54 -0
- package/src/media/functional/functional-basic/classes/HashInstance/HashInstance.vi.mdx +54 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.en.mdx +78 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.ru.mdx +78 -0
- package/src/media/functional/functional-basic/classes/MetaStatic/MetaStatic.vi.mdx +78 -0
- package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.en.mdx +50 -0
- package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.ru.mdx +50 -0
- package/src/media/functional/functional-basic/classes/ResumableTimer/ResumableTimer.vi.mdx +50 -0
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.en.mdx +131 -0
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.ru.mdx +131 -0
- package/src/media/functional/functional-basic/classes/ServerStorage/ServerStorage.vi.mdx +131 -0
- package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.en.mdx +97 -0
- package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.ru.mdx +97 -0
- package/src/media/functional/functional-basic/classes/StorageCallback/StorageCallback.vi.mdx +97 -0
- package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.en.mdx +13 -5
- package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.ru.mdx +13 -5
- package/src/media/functional/functional-basic/functions/addTagHighlightMatch/addTagHighlightMatch.vi.mdx +13 -5
- package/src/media/functional/functional-basic/functions/anyToString/anyToString.en.mdx +37 -19
- package/src/media/functional/functional-basic/functions/anyToString/anyToString.ru.mdx +37 -19
- package/src/media/functional/functional-basic/functions/anyToString/anyToString.vi.mdx +35 -17
- package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.en.mdx +31 -19
- package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.ru.mdx +31 -19
- package/src/media/functional/functional-basic/functions/applyTemplate/applyTemplate.vi.mdx +32 -20
- package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.en.mdx +29 -15
- package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.ru.mdx +28 -14
- package/src/media/functional/functional-basic/functions/blobToBase64/blobToBase64.vi.mdx +28 -14
- package/src/media/functional/functional-basic/functions/capitalize/capitalize.en.mdx +7 -3
- package/src/media/functional/functional-basic/functions/capitalize/capitalize.ru.mdx +7 -3
- package/src/media/functional/functional-basic/functions/capitalize/capitalize.vi.mdx +7 -3
- package/src/media/functional/functional-basic/functions/copyObject/copyObject.en.mdx +17 -13
- package/src/media/functional/functional-basic/functions/copyObject/copyObject.ru.mdx +17 -13
- package/src/media/functional/functional-basic/functions/copyObject/copyObject.vi.mdx +17 -13
- package/src/media/functional/functional-basic/functions/createElement/createElement.en.mdx +2 -0
- package/src/media/functional/functional-basic/functions/createElement/createElement.ru.mdx +2 -0
- package/src/media/functional/functional-basic/functions/createElement/createElement.vi.mdx +2 -0
- package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.en.mdx +1 -3
- package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.ru.mdx +1 -3
- package/src/media/functional/functional-basic/functions/encodeAttribute/encodeAttribute.vi.mdx +1 -3
- package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.en.mdx +13 -10
- package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.ru.mdx +14 -11
- package/src/media/functional/functional-basic/functions/executeFunction/executeFunction.vi.mdx +12 -9
- package/src/media/functional/functional-basic/functions/executePromise/executePromise.en.mdx +14 -13
- package/src/media/functional/functional-basic/functions/executePromise/executePromise.ru.mdx +15 -14
- package/src/media/functional/functional-basic/functions/executePromise/executePromise.vi.mdx +14 -13
- package/src/media/functional/functional-basic/functions/forEach/forEach.en.mdx +1 -1
- package/src/media/functional/functional-basic/functions/forEach/forEach.ru.mdx +1 -1
- package/src/media/functional/functional-basic/functions/forEach/forEach.vi.mdx +1 -1
- package/src/media/functional/functional-basic/functions/frame/frame.en.mdx +7 -4
- package/src/media/functional/functional-basic/functions/frame/frame.ru.mdx +6 -3
- package/src/media/functional/functional-basic/functions/frame/frame.vi.mdx +7 -4
- package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.en.mdx +34 -0
- package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.ru.mdx +34 -0
- package/src/media/functional/functional-basic/functions/getArrayHighlightMatch/getArrayHighlightMatch.vi.mdx +35 -0
- package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.en.mdx +2 -0
- package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.ru.mdx +2 -0
- package/src/media/functional/functional-basic/functions/getCurrentDate/getCurrentDate.vi.mdx +2 -0
- package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.en.mdx +21 -0
- package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.ru.mdx +21 -0
- package/src/media/functional/functional-basic/functions/getCurrentTime/getCurrentTime.vi.mdx +21 -0
- package/src/media/functional/functional-basic/functions/getElementId/getElementId.en.mdx +17 -3
- package/src/media/functional/functional-basic/functions/getElementId/getElementId.ru.mdx +17 -3
- package/src/media/functional/functional-basic/functions/getElementId/getElementId.vi.mdx +18 -4
- package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.en.mdx +31 -0
- package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.ru.mdx +31 -0
- package/src/media/functional/functional-basic/functions/getElementSafeScript/getElementSafeScript.vi.mdx +31 -0
- package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.en.mdx +25 -0
- package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.ru.mdx +25 -0
- package/src/media/functional/functional-basic/functions/getOnlyText/getOnlyText.vi.mdx +25 -0
- package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.en.mdx +11 -4
- package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.ru.mdx +14 -7
- package/src/media/functional/functional-basic/functions/getSearchExp/getSearchExp.vi.mdx +13 -6
- package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.en.mdx +3 -2
- package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.ru.mdx +3 -2
- package/src/media/functional/functional-basic/functions/getSeparatingSearchExp/getSeparatingSearchExp.vi.mdx +3 -2
- package/src/media/functional/functional-basic/functions/toNumber/toNumber.en.mdx +25 -9
- package/src/media/functional/functional-basic/functions/toNumber/toNumber.ru.mdx +25 -9
- package/src/media/functional/functional-basic/functions/toNumber/toNumber.vi.mdx +25 -9
- package/src/media/functional/functional-basic/functions/toString/toString.en.mdx +28 -0
- package/src/media/functional/functional-basic/functions/toString/toString.ru.mdx +28 -0
- package/src/media/functional/functional-basic/functions/toString/toString.vi.mdx +28 -0
- package/src/media/functional/ui/about/about.en.mdx +45 -0
- package/src/media/functional/ui/about/about.ru.mdx +45 -0
- package/src/media/functional/ui/about/about.vi.mdx +45 -0
- package/src/media/functional/ui/component/component.en.mdx +104 -0
- package/src/media/functional/ui/component/component.ru.mdx +106 -0
- package/src/media/functional/ui/component/component.vi.mdx +104 -0
- package/src/media/functional/ui/setup/setup.en.mdx +72 -0
- package/src/media/functional/ui/setup/setup.ru.mdx +72 -0
- package/src/media/functional/ui/setup/setup.vi.mdx +72 -0
- package/src/media/functional/ui/wiki-data.en.mdx +114 -0
- package/src/media/functional/ui/wiki-data.ru.mdx +114 -0
- package/src/media/functional/ui/wiki-data.vi.mdx +114 -0
- package/dist/WikiStorybookDescriptions-IKMchHA-.js +0 -26959
package/package.json
CHANGED
package/src/library.ts
CHANGED
|
@@ -6,6 +6,17 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
6
6
|
|
|
7
7
|
The `Api` class is a central utility for making HTTP requests. It provides a simple interface for common methods and manages global settings like base URL, default headers, and lifecycle hooks.
|
|
8
8
|
|
|
9
|
+
### Key Capabilities
|
|
10
|
+
|
|
11
|
+
The class provides a comprehensive set of tools for managing network communication:
|
|
12
|
+
- **CRUD Methods** — execution of `GET`, `POST`, `PUT`, `PATCH`, `DELETE` requests.
|
|
13
|
+
- **Global Configuration** — setting up base URLs, headers, and parameters.
|
|
14
|
+
- **Lifecycle Hooks** — handling events before and after the request (e.g., for Refresh Token).
|
|
15
|
+
- **Hydration (SSR)** — transferring data from server to client to prevent duplicate requests.
|
|
16
|
+
- **Caching** — saving responses in memory or external storage (LocalStorage).
|
|
17
|
+
- **Response Emulation** — creating mock data for development and testing.
|
|
18
|
+
- **Loading and Error Management** — integration with global indicator components and error centers.
|
|
19
|
+
|
|
9
20
|
## Basic Usage
|
|
10
21
|
|
|
11
22
|
The simplest way to make a request is by using the static methods `get`, `post`, `put`, or `delete`. All methods support response typing via Generics.
|
|
@@ -84,6 +95,40 @@ Api.setEnd(async (response, apiFetch) => {
|
|
|
84
95
|
})
|
|
85
96
|
```
|
|
86
97
|
|
|
98
|
+
## Hydration
|
|
99
|
+
|
|
100
|
+
Hydration allows transferring data obtained during server-side rendering (SSR) to the client side. This prevents the same requests from being executed again immediately after the page loads.
|
|
101
|
+
|
|
102
|
+
1. **On the Server**: Perform the necessary requests and get the script via `Api.getHydrationScript()`.
|
|
103
|
+
2. **In the Template**: Insert the resulting string into the HTML.
|
|
104
|
+
3. **On the Client**: Upon `Api` initialization, the data will be automatically loaded into the response manager.
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// SSR Example
|
|
108
|
+
await Api.get({ path: 'settings' });
|
|
109
|
+
const hydrationScript = Api.getHydrationScript(); // <script>...</script>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Caching
|
|
113
|
+
|
|
114
|
+
The `Api` class supports automatic response caching. You can use either the built-in in-memory storage or connect external storage (e.g., `LocalStorage`).
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
import { ApiCache, DataStorage } from '@dxtmisha/functional-basic';
|
|
118
|
+
|
|
119
|
+
// Connecting external storage (optional)
|
|
120
|
+
ApiCache.init(
|
|
121
|
+
async (key) => DataStorage.get(key),
|
|
122
|
+
async (key, value) => DataStorage.set(key, value)
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Usage in a request
|
|
126
|
+
const data = await Api.get({
|
|
127
|
+
path: 'catalog/list',
|
|
128
|
+
cache: 3600 // Cache for 1 hour (in seconds)
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
87
132
|
## Response Emulation
|
|
88
133
|
|
|
89
134
|
The built-in `ApiResponse` manager (accessible via `Api.getResponse()`) allows you to intercept requests and return mock data. This is extremely useful for UI development when the backend is not ready, or for writing tests.
|
|
@@ -6,6 +6,17 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
6
6
|
|
|
7
7
|
Класс `Api` — это основной инструмент для работы с HTTP-запросами. Он предоставляет простой интерфейс для стандартных методов и управляет глобальными настройками, такими как базовый URL, заголовки по умолчанию и хуки жизненного цикла.
|
|
8
8
|
|
|
9
|
+
### Основные возможности
|
|
10
|
+
|
|
11
|
+
Класс предоставляет полный набор инструментов для управления сетевым взаимодействием:
|
|
12
|
+
- **CRUD методы** — выполнение `GET`, `POST`, `PUT`, `PATCH`, `DELETE` запросов.
|
|
13
|
+
- **Глобальная конфигурация** — настройка базовых URL, заголовков и параметров.
|
|
14
|
+
- **Хуки жизненного цикла** — обработка событий до и после запроса (например, для Refresh Token).
|
|
15
|
+
- **Гидратация (SSR)** — передача данных от сервера к клиенту для предотвращения дублирования запросов.
|
|
16
|
+
- **Кэширование** — сохранение ответов в памяти или внешнем хранилище (LocalStorage).
|
|
17
|
+
- **Эмуляция ответов** — создание мок-данных для разработки и тестирования.
|
|
18
|
+
- **Управление загрузкой и ошибками** — интеграция с глобальными компонентами индикации и центрами ошибок.
|
|
19
|
+
|
|
9
20
|
## Базовое использование
|
|
10
21
|
|
|
11
22
|
Самый простой способ выполнить запрос — использовать статические методы `get`, `post`, `put`, или `delete`. Все методы поддерживают типизацию ответа через Generic.
|
|
@@ -84,6 +95,40 @@ Api.setEnd(async (response, apiFetch) => {
|
|
|
84
95
|
})
|
|
85
96
|
```
|
|
86
97
|
|
|
98
|
+
## Гидратация
|
|
99
|
+
|
|
100
|
+
Гидратация позволяет передавать данные, полученные при серверном рендеринге (SSR), на клиентскую сторону. Это предотвращает повторное выполнение одних и тех же запросов сразу после загрузки страницы.
|
|
101
|
+
|
|
102
|
+
1. **На сервере**: выполните нужные запросы и получите скрипт через `Api.getHydrationScript()`.
|
|
103
|
+
2. **В шаблоне**: вставьте полученную строку в HTML.
|
|
104
|
+
3. **На клиенте**: при инициализации `Api` данные будут автоматически загружены в менеджер ответов.
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// Пример на сервере (SSR)
|
|
108
|
+
await Api.get({ path: 'settings' });
|
|
109
|
+
const hydrationScript = Api.getHydrationScript(); // <script>...</script>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Кэширование
|
|
113
|
+
|
|
114
|
+
Класс `Api` поддерживает автоматическое кэширование ответов. Вы можете использовать как встроенное хранилище в памяти, так и подключить внешнее (например, `LocalStorage`).
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
import { ApiCache, DataStorage } from '@dxtmisha/functional-basic';
|
|
118
|
+
|
|
119
|
+
// Подключение внешнего хранилища (необязательно)
|
|
120
|
+
ApiCache.init(
|
|
121
|
+
async (key) => DataStorage.get(key),
|
|
122
|
+
async (key, value) => DataStorage.set(key, value)
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Использование в запросе
|
|
126
|
+
const data = await Api.get({
|
|
127
|
+
path: 'catalog/list',
|
|
128
|
+
cache: 3600 // Кэшировать на 1 час (в секундах)
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
87
132
|
## Эмуляция ответов
|
|
88
133
|
|
|
89
134
|
Встроенный менеджер `ApiResponse` (доступен через `Api.getResponse()`) позволяет перехватывать запросы и возвращать мок-данные. Это крайне полезно при разработке интерфейса, когда бэкенд еще не готов, или для написания тестов.
|
|
@@ -6,6 +6,17 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
6
6
|
|
|
7
7
|
Lớp `Api` là công cụ trung tâm để thực hiện các yêu cầu HTTP. Nó cung cấp một giao diện đơn giản cho các phương thức phổ biến và quản lý các cài đặt toàn cục như URL cơ sở, tiêu đề mặc định và các hook vòng đời.
|
|
8
8
|
|
|
9
|
+
### Các khả năng chính
|
|
10
|
+
|
|
11
|
+
Lớp cung cấp một bộ công cụ toàn diện để quản lý tương tác mạng:
|
|
12
|
+
- **Các phương thức CRUD** — thực hiện các yêu cầu `GET`, `POST`, `PUT`, `PATCH`, `DELETE`.
|
|
13
|
+
- **Cấu hình toàn cục** — thiết lập URL cơ sở, tiêu đề và tham số.
|
|
14
|
+
- **Hook vòng đời** — xử lý các sự kiện trước và sau yêu cầu (ví dụ: cho Refresh Token).
|
|
15
|
+
- **Hydration (SSR)** — chuyển dữ liệu từ máy chủ sang máy khách để ngăn chặn các yêu cầu trùng lặp.
|
|
16
|
+
- **Bộ nhớ đệm (Caching)** — lưu các phản hồi trong bộ nhớ hoặc bộ nhớ ngoài (LocalStorage).
|
|
17
|
+
- **Giả lập phản hồi** — tạo dữ liệu giả để phát triển và kiểm thử.
|
|
18
|
+
- **Quản lý tải và lỗi** — tích hợp với các thành phần chỉ báo toàn cục và trung tâm lỗi.
|
|
19
|
+
|
|
9
20
|
## Cách dùng cơ bản
|
|
10
21
|
|
|
11
22
|
Cách đơn giản nhất để thực hiện yêu cầu là sử dụng các phương thức tĩnh `get`, `post`, `put`, hoặc `delete`. Tất cả các phương thức đều hỗ trợ định nghĩa kiểu dữ liệu (typing) thông qua Generic.
|
|
@@ -84,6 +95,40 @@ Api.setEnd(async (response, apiFetch) => {
|
|
|
84
95
|
})
|
|
85
96
|
```
|
|
86
97
|
|
|
98
|
+
## Hydration
|
|
99
|
+
|
|
100
|
+
Hydration cho phép chuyển dữ liệu thu được trong quá trình server-side rendering (SSR) sang phía máy khách. Điều này ngăn chặn việc thực hiện lại các yêu cầu tương tự ngay sau khi trang tải xong.
|
|
101
|
+
|
|
102
|
+
1. **Trên máy chủ**: Thực hiện các yêu cầu cần thiết và lấy script qua `Api.getHydrationScript()`.
|
|
103
|
+
2. **Trong mẫu (Template)**: Chèn chuỗi kết quả vào HTML.
|
|
104
|
+
3. **Trên máy khách**: Khi khởi tạo `Api`, dữ liệu sẽ tự động được tải vào trình quản lý phản hồi.
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// Ví dụ SSR
|
|
108
|
+
await Api.get({ path: 'settings' });
|
|
109
|
+
const hydrationScript = Api.getHydrationScript(); // <script>...</script>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Bộ nhớ đệm (Caching)
|
|
113
|
+
|
|
114
|
+
Lớp `Api` hỗ trợ tự động lưu bộ nhớ đệm cho các phản hồi. Bạn có thể sử dụng bộ nhớ trong tích hợp hoặc kết nối bộ nhớ ngoài (ví dụ: `LocalStorage`).
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
import { ApiCache, DataStorage } from '@dxtmisha/functional-basic';
|
|
118
|
+
|
|
119
|
+
// Kết nối bộ nhớ ngoài (tùy chọn)
|
|
120
|
+
ApiCache.init(
|
|
121
|
+
async (key) => DataStorage.get(key),
|
|
122
|
+
async (key, value) => DataStorage.set(key, value)
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Sử dụng trong một yêu cầu
|
|
126
|
+
const data = await Api.get({
|
|
127
|
+
path: 'catalog/list',
|
|
128
|
+
cache: 3600 // Lưu bộ nhớ đệm trong 1 giờ (tính bằng giây)
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
87
132
|
## Giả lập phản hồi
|
|
88
133
|
|
|
89
134
|
Trình quản lý `ApiResponse` tích hợp sẵn (có thể truy cập qua `Api.getResponse()`) cho phép bạn chặn các yêu cầu và trả về dữ liệu giả (mock). Điều này cực kỳ hữu ích cho việc phát triển giao diện khi backend chưa sẵn sàng hoặc để viết các bài kiểm thử.
|
|
@@ -1,78 +1,78 @@
|
|
|
1
1
|
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
2
|
|
|
3
|
-
<Meta title='@dxtmisha/en/functional-basic/Classes/Api - Request Management'/>
|
|
3
|
+
<Meta title='@dxtmisha/en/functional-basic/Classes/Api - Request Management (Static)'/>
|
|
4
4
|
|
|
5
5
|
# Api Class
|
|
6
6
|
|
|
7
|
-
`Api` is a static wrapper
|
|
7
|
+
The `Api` class is a **Primary Class (Static)** and serves as the main entry point for managing HTTP requests. It is a static wrapper around a globally managed `ApiInstance`, providing a clean, singleton-based interface for standard network operations.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Key Features
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
- **Static Interface** — perform standard HTTP operations (`GET`, `POST`, etc.) without manual instantiation.
|
|
12
|
+
- **Global Lifecycle Hooks** — configure request preparation and analysis once for the entire application.
|
|
13
|
+
- **SSR Isolation** — utilizes `ServerStorage` to manage individual instance isolation during server-side rendering.
|
|
14
|
+
- **Simplified Setup** — provides a unified `setConfig` method to apply multiple configuration layers at once.
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
Api.setUrl('https://api.example.com/v1/')
|
|
16
|
-
Api.setHeaders({ 'Authorization': 'Bearer token123' })
|
|
16
|
+
## Methods
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
```
|
|
18
|
+
### Action
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
Methods for performing physical network requests.
|
|
21
|
+
|
|
22
|
+
- `request<T>(pathRequest: string | ApiFetch): Promise<T>` — Core executor; accepts a path string or configuration object.
|
|
23
|
+
- `get<T>(request: ApiFetch): Promise<T>` — Sends a GET request.
|
|
24
|
+
- `post<T>(request: ApiFetch): Promise<T>` — Sends a POST request.
|
|
25
|
+
- `put<T>(request: ApiFetch): Promise<T>` — Sends a PUT request.
|
|
26
|
+
- `patch<T>(request: ApiFetch): Promise<T>` — Sends a PATCH request.
|
|
27
|
+
- `delete<T>(request: ApiFetch): Promise<T>` — Sends a DELETE request.
|
|
28
|
+
|
|
29
|
+
### Check
|
|
30
|
+
|
|
31
|
+
- `isLocalhost(): boolean` — Checks if the current environment is a local development server.
|
|
22
32
|
|
|
23
|
-
###
|
|
33
|
+
### Configuration
|
|
24
34
|
|
|
25
|
-
- `
|
|
35
|
+
- `setUrl(url: string): void` — Changes the base API URL.
|
|
36
|
+
- `setHeaders(headers: Record<string, string>): void` — Sets default request headers.
|
|
37
|
+
- `setRequestDefault(request: Record<string, any>): void` — Sets default request body data.
|
|
38
|
+
- `setPreparation(callback): void` — Registers a hook to run before every enabled request.
|
|
39
|
+
- `setEnd(callback): void` — Registers a hook to run after every enabled response.
|
|
40
|
+
- `setTimeout(timeout: number): void` — Changes the global request timeout.
|
|
41
|
+
- `setConfig(config?: ApiConfig): void` — Applies a complete configuration object.
|
|
26
42
|
|
|
27
|
-
###
|
|
43
|
+
### Auxiliary
|
|
28
44
|
|
|
29
|
-
- `
|
|
30
|
-
- `
|
|
31
|
-
- `
|
|
32
|
-
- `
|
|
33
|
-
- `
|
|
34
|
-
- `
|
|
45
|
+
- `getStatus(): ApiStatus` — Accesses the status manager for the last request.
|
|
46
|
+
- `getResponse(): ApiResponse` — Accesses the response/emulation manager.
|
|
47
|
+
- `getHydration(): ApiHydration` — Accesses the hydration manager.
|
|
48
|
+
- `getHydrationScript(): string` — Returns the script block for SSR-to-client hydration.
|
|
49
|
+
- `getUrl(path: string, api?: boolean): string` — Returns the fully resolved URL with `{locale}`, `{country}`, `{language}` placeholder substitution.
|
|
50
|
+
- `getBody(request, method?): string | FormData | undefined` — Prepares the request body.
|
|
51
|
+
- `getBodyForGet(request, path?, method?): string` — Prepares the query string.
|
|
52
|
+
- `getItem(): ApiInstance` — Returns the underlying `ApiInstance` object.
|
|
35
53
|
|
|
36
|
-
|
|
54
|
+
## Types
|
|
37
55
|
|
|
38
|
-
|
|
56
|
+
### ApiConfig
|
|
39
57
|
|
|
40
|
-
- `
|
|
41
|
-
- `
|
|
42
|
-
- `
|
|
43
|
-
- `
|
|
44
|
-
- `
|
|
45
|
-
- `
|
|
58
|
+
- `urlRoot: string` — the base URL for the API.
|
|
59
|
+
- `headers: Record<string, string>` — default request headers.
|
|
60
|
+
- `requestDefault: Record<string, any>` — default request data.
|
|
61
|
+
- `preparation: (apiFetch: ApiFetch) => Promise<void>` — entry hook.
|
|
62
|
+
- `end: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>` — exit hook.
|
|
63
|
+
- `timeout: number` — global timeout in milliseconds.
|
|
46
64
|
|
|
47
|
-
|
|
65
|
+
## Proxy Architecture
|
|
48
66
|
|
|
49
|
-
|
|
50
|
-
- `get<T>(request: ApiFetch): Promise<T>` — Sends an HTTP GET request.
|
|
51
|
-
- `post<T>(request: ApiFetch): Promise<T>` — Sends an HTTP POST request.
|
|
52
|
-
- `put<T>(request: ApiFetch): Promise<T>` — Sends an HTTP PUT request.
|
|
53
|
-
- `delete<T>(request: ApiFetch): Promise<T>` — Sends an HTTP DELETE request.
|
|
67
|
+
The `Api` class operates as a **Static Proxy**. All method calls are redirected to an internal `ApiInstance`.
|
|
54
68
|
|
|
55
|
-
|
|
69
|
+
### Instance Management
|
|
56
70
|
|
|
57
|
-
The `
|
|
71
|
+
The internal manager is stored in `ServerStorage` using a unique key (`__dxt_api_instance__`). This architecture solves two major problems:
|
|
58
72
|
|
|
59
|
-
|
|
60
|
-
|
|
73
|
+
1. **Thread Safety in SSR**: During server-side rendering, `ServerStorage` ensures that each incoming request has its own isolated API configuration and state, preventing data leaks between users.
|
|
74
|
+
2. **Singleton Simplicity on Client**: On the client side, it behaves as a true singleton, allowing you to configure the API in your entry point and use it anywhere without passing instances.
|
|
61
75
|
|
|
62
|
-
|
|
63
|
-
urlRoot: 'https://api.example.com/v1/',
|
|
64
|
-
headers: { 'Authorization': 'Bearer token123' },
|
|
65
|
-
requestDefault: { source: 'webapp' },
|
|
66
|
-
preparation: async (apiFetch) => {
|
|
67
|
-
console.log('Preparing:', apiFetch.path)
|
|
68
|
-
},
|
|
69
|
-
end: async (response, apiFetch) => {
|
|
70
|
-
if (response.status === 401) {
|
|
71
|
-
return { reset: true }
|
|
72
|
-
}
|
|
73
|
-
return {}
|
|
74
|
-
}
|
|
75
|
-
})
|
|
76
|
-
```
|
|
76
|
+
### Delegation
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
While `Api` is the preferred interface for standard application logic, the core logic (retries, hydration logic, jitter) resides within `ApiInstance`. For advanced scenarios involving multiple base URLs or different header sets simultaneously, you may instantiate `ApiInstance` directly.
|
|
@@ -1,78 +1,78 @@
|
|
|
1
1
|
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
2
|
|
|
3
|
-
<Meta title='@dxtmisha/ru/functional-basic/Classes/Api - Управление запросами'/>
|
|
3
|
+
<Meta title='@dxtmisha/ru/functional-basic/Classes/Api - Управление запросами (Static)'/>
|
|
4
4
|
|
|
5
5
|
# Класс Api
|
|
6
6
|
|
|
7
|
-
`Api`
|
|
7
|
+
Класс `Api` является **основным классом (статическим)** и служит главной точкой входа для управления HTTP-запросами. Он представляет собой статическую обертку над глобально управляемым `ApiInstance`, предоставляя чистый интерфейс на основе синглтона для стандартных сетевых операций.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Ключевые особенности
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
- **Статический интерфейс** — выполнение стандартных HTTP-операций (`GET`, `POST` и т. д.) без необходимости ручного создания экземпляров.
|
|
12
|
+
- **Глобальные хуки жизненного цикла** — настройте подготовку и анализ запросов один раз для всего приложения.
|
|
13
|
+
- **Изоляция в SSR** — использует `ServerStorage` для управления изоляцией отдельных экземпляров во время рендеринга на стороне сервера.
|
|
14
|
+
- **Упрощенная настройка** — предоставляет унифицированный метод `setConfig` для одновременного применения нескольких слоев конфигурации.
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
Api.setUrl('https://api.example.com/v1/')
|
|
16
|
-
Api.setHeaders({ 'Authorization': 'Bearer token123' })
|
|
16
|
+
## Методы
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
```
|
|
18
|
+
### Действие
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
Методы для выполнения физических сетевых запросов.
|
|
21
|
+
|
|
22
|
+
- `request<T>(pathRequest: string | ApiFetch): Promise<T>` — Основной исполнитель; принимает строку пути или объект конфигурации.
|
|
23
|
+
- `get<T>(request: ApiFetch): Promise<T>` — Отправляет GET-запрос.
|
|
24
|
+
- `post<T>(request: ApiFetch): Promise<T>` — Отправляет POST-запрос.
|
|
25
|
+
- `put<T>(request: ApiFetch): Promise<T>` — Отправляет PUT-запрос.
|
|
26
|
+
- `patch<T>(request: ApiFetch): Promise<T>` — Отправляет PATCH-запрос.
|
|
27
|
+
- `delete<T>(request: ApiFetch): Promise<T>` — Отправляет DELETE-запрос.
|
|
28
|
+
|
|
29
|
+
### Проверка
|
|
30
|
+
|
|
31
|
+
- `isLocalhost(): boolean` — Проверяет, запущена ли среда на локальном сервере разработки.
|
|
22
32
|
|
|
23
|
-
###
|
|
33
|
+
### Конфигурация
|
|
24
34
|
|
|
25
|
-
- `
|
|
35
|
+
- `setUrl(url: string): void` — Изменяет базовый URL API.
|
|
36
|
+
- `setHeaders(headers: Record<string, string>): void` — Устанавливает заголовки запроса по умолчанию.
|
|
37
|
+
- `setRequestDefault(request: Record<string, any>): void` — Устанавливает данные тела запроса по умолчанию.
|
|
38
|
+
- `setPreparation(callback): void` — Регистрирует хук, запускаемый перед каждым включенным запросом.
|
|
39
|
+
- `setEnd(callback): void` — Регистрирует хук, запускаемый после каждого включенного ответа.
|
|
40
|
+
- `setTimeout(timeout: number): void` — Изменяет глобальный таймаут запроса.
|
|
41
|
+
- `setConfig(config?: ApiConfig): void` — Применяет полный объект конфигурации.
|
|
26
42
|
|
|
27
|
-
###
|
|
43
|
+
### Вспомогательные
|
|
28
44
|
|
|
29
|
-
- `
|
|
30
|
-
- `
|
|
31
|
-
- `
|
|
32
|
-
- `
|
|
33
|
-
- `
|
|
34
|
-
- `
|
|
45
|
+
- `getStatus(): ApiStatus` — Доступ к менеджеру статуса последнего запроса.
|
|
46
|
+
- `getResponse(): ApiResponse` — Доступ к менеджеру ответов/эмуляции.
|
|
47
|
+
- `getHydration(): ApiHydration` — Доступ к менеджеру гидратации.
|
|
48
|
+
- `getHydrationScript(): string` — Возвращает блок скрипта для гидратации SSR-клиент.
|
|
49
|
+
- `getUrl(path: string, api?: boolean): string` — Возвращает полностью разрешенный URL с подстановкой плейсхолдеров `{locale}`, `{country}`, `{language}`.
|
|
50
|
+
- `getBody(request?, method?): string | FormData | undefined` — Подготавливает тело запроса.
|
|
51
|
+
- `getBodyForGet(request, path?, method?): string` — Подготавливает строку запроса.
|
|
52
|
+
- `getItem(): ApiInstance` — Возвращает базовый объект `ApiInstance`.
|
|
35
53
|
|
|
36
|
-
|
|
54
|
+
## Типы
|
|
37
55
|
|
|
38
|
-
|
|
56
|
+
### ApiConfig
|
|
39
57
|
|
|
40
|
-
- `
|
|
41
|
-
- `
|
|
42
|
-
- `
|
|
43
|
-
- `
|
|
44
|
-
- `
|
|
45
|
-
- `
|
|
58
|
+
- `urlRoot: string` — базовый URL для API.
|
|
59
|
+
- `headers: Record<string, string>` — заголовки запроса по умолчанию.
|
|
60
|
+
- `requestDefault: Record<string, any>` — данные запроса по умолчанию.
|
|
61
|
+
- `preparation: (apiFetch: ApiFetch) => Promise<void>` — входной хук.
|
|
62
|
+
- `end: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>` — выходной хук.
|
|
63
|
+
- `timeout: number` — глобальный таймаут в миллисекундах.
|
|
46
64
|
|
|
47
|
-
|
|
65
|
+
## Прокси-архитектура
|
|
48
66
|
|
|
49
|
-
|
|
50
|
-
- `get<T>(request: ApiFetch): Promise<T>` — Отправляет HTTP GET запрос.
|
|
51
|
-
- `post<T>(request: ApiFetch): Promise<T>` — Отправляет HTTP POST запрос.
|
|
52
|
-
- `put<T>(request: ApiFetch): Promise<T>` — Отправляет HTTP PUT запрос.
|
|
53
|
-
- `delete<T>(request: ApiFetch): Promise<T>` — Отправляет HTTP DELETE запрос.
|
|
67
|
+
Класс `Api` работает как **статический прокси**. Все вызовы методов перенаправляются на внутренний `ApiInstance`.
|
|
54
68
|
|
|
55
|
-
|
|
69
|
+
### Управление экземпляром
|
|
56
70
|
|
|
57
|
-
|
|
71
|
+
Внутренний менеджер хранится в `ServerStorage` под уникальным ключом (`__dxt_api_instance__`). Эта архитектура решает две основные проблемы:
|
|
58
72
|
|
|
59
|
-
|
|
60
|
-
|
|
73
|
+
1. **Потокобезопасность в SSR**: Во время рендеринга на стороне сервера `ServerStorage` гарантирует, что каждый входящий запрос имеет свою собственную изолированную конфигурацию и состояние API, предотвращая утечку данных между пользователями.
|
|
74
|
+
2. **Простота синглтона на клиенте**: На стороне клиента он ведет себя как настоящий синглтон, позволяя настроить API в точке входа и использовать его где угодно без передачи экземпляров.
|
|
61
75
|
|
|
62
|
-
|
|
63
|
-
urlRoot: 'https://api.example.com/v1/',
|
|
64
|
-
headers: { 'Authorization': 'Bearer token123' },
|
|
65
|
-
requestDefault: { source: 'webapp' },
|
|
66
|
-
preparation: async (apiFetch) => {
|
|
67
|
-
console.log('Подготовка:', apiFetch.path)
|
|
68
|
-
},
|
|
69
|
-
end: async (response, apiFetch) => {
|
|
70
|
-
if (response.status === 401) {
|
|
71
|
-
return { reset: true }
|
|
72
|
-
}
|
|
73
|
-
return {}
|
|
74
|
-
}
|
|
75
|
-
})
|
|
76
|
-
```
|
|
76
|
+
### Делегирование
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
Хотя `Api` является предпочтительным интерфейсом для стандартной логики приложения, основная логика (повторы, гидратация, джиттер) находится внутри `ApiInstance`. Для сложных сценариев, включающих несколько базовых URL-адресов или разные наборы заголовков одновременно, вы можете создавать экземпляры `ApiInstance` напрямую.
|
|
@@ -1,78 +1,78 @@
|
|
|
1
1
|
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
2
|
|
|
3
|
-
<Meta title='@dxtmisha/vi/functional-basic/Classes/Api - Quản lý yêu cầu (
|
|
3
|
+
<Meta title='@dxtmisha/vi/functional-basic/Classes/Api - Quản lý yêu cầu (Static)'/>
|
|
4
4
|
|
|
5
5
|
# Lớp Api
|
|
6
6
|
|
|
7
|
-
`Api` là
|
|
7
|
+
Lớp `Api` là **Lớp chính (Tĩnh)** và đóng vai trò là điểm truy cập chính để quản lý các yêu cầu HTTP. Nó là một wrapper tĩnh bao quanh một `ApiInstance` được quản lý toàn cục, cung cấp một giao diện singleton sạch sẽ cho các hoạt động mạng tiêu chuẩn.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Các tính năng chính
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
- **Giao diện tĩnh** — thực hiện các hoạt động HTTP tiêu chuẩn (`GET`, `POST`, v.v.) mà không cần khởi tạo thủ công.
|
|
12
|
+
- **Hook vòng đời toàn cục** — cấu hình việc chuẩn bị và phân tích yêu cầu một lần cho toàn bộ ứng dụng.
|
|
13
|
+
- **Cách ly SSR** — sử dụng `ServerStorage` để quản lý việc cách ly các instance riêng lẻ trong quá trình render phía máy chủ.
|
|
14
|
+
- **Thiết lập đơn giản** — cung cấp phương thức `setConfig` thống nhất để áp dụng nhiều lớp cấu hình cùng một lúc.
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
Api.setUrl('https://api.example.com/v1/')
|
|
16
|
-
Api.setHeaders({ 'Authorization': 'Bearer token123' })
|
|
16
|
+
## Các phương thức
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
```
|
|
18
|
+
### Hành động
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
Các phương thức để thực hiện các yêu cầu mạng vật lý.
|
|
21
|
+
|
|
22
|
+
- `request<T>(pathRequest: string | ApiFetch): Promise<T>` — Trình thực thi cốt lõi; chấp nhận một chuỗi đường dẫn hoặc đối tượng cấu hình.
|
|
23
|
+
- `get<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu GET.
|
|
24
|
+
- `post<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu POST.
|
|
25
|
+
- `put<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu PUT.
|
|
26
|
+
- `patch<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu PATCH.
|
|
27
|
+
- `delete<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu DELETE.
|
|
28
|
+
|
|
29
|
+
### Kiểm tra
|
|
30
|
+
|
|
31
|
+
- `isLocalhost(): boolean` — Kiểm tra xem môi trường hiện tại có phải là máy chủ phát triển cục bộ hay không.
|
|
22
32
|
|
|
23
|
-
###
|
|
33
|
+
### Cấu hình
|
|
24
34
|
|
|
25
|
-
- `
|
|
35
|
+
- `setUrl(url: string): void` — Thay đổi URL base của API.
|
|
36
|
+
- `setHeaders(headers: Record<string, string>): void` — Thiết lập các header yêu cầu mặc định.
|
|
37
|
+
- `setRequestDefault(request: Record<string, any>): void` — Thiết lập dữ liệu body yêu cầu mặc định.
|
|
38
|
+
- `setPreparation(callback): void` — Đăng ký một hook để chạy trước mỗi yêu cầu được bật.
|
|
39
|
+
- `setEnd(callback): void` — Đăng ký một hook để chạy sau mỗi phản hồi được bật.
|
|
40
|
+
- `setTimeout(timeout: number): void` — Thay đổi timeout yêu cầu toàn cục.
|
|
41
|
+
- `setConfig(config?: ApiConfig): void` — Áp dụng một đối tượng cấu hình đầy đủ.
|
|
26
42
|
|
|
27
|
-
###
|
|
43
|
+
### Phụ trợ
|
|
28
44
|
|
|
29
|
-
- `
|
|
30
|
-
- `
|
|
31
|
-
- `
|
|
32
|
-
- `
|
|
33
|
-
- `
|
|
34
|
-
- `
|
|
45
|
+
- `getStatus(): ApiStatus` — Truy cập trình quản lý trạng thái cho yêu cầu cuối cùng.
|
|
46
|
+
- `getResponse(): ApiResponse` — Truy cập trình quản lý phản hồi/mô phỏng.
|
|
47
|
+
- `getHydration(): ApiHydration` — Truy cập trình quản lý hydration.
|
|
48
|
+
- `getHydrationScript(): string` — Trả về khối script để hydration từ SSR sang client.
|
|
49
|
+
- `getUrl(path: string, api?: boolean): string` — Trả về URL đã được phân giải đầy đủ với các token bản địa hóa.
|
|
50
|
+
- `getBody(request?, method?): string | FormData | undefined` — Chuẩn bị body yêu cầu.
|
|
51
|
+
- `getBodyForGet(request, path?, method?): string` — Chuẩn bị chuỗi truy vấn (query string).
|
|
52
|
+
- `getItem(): ApiInstance` — Trả về đối tượng `ApiInstance` cơ sở.
|
|
35
53
|
|
|
36
|
-
|
|
54
|
+
## Các kiểu dữ liệu (Types)
|
|
37
55
|
|
|
38
|
-
|
|
56
|
+
### ApiConfig
|
|
39
57
|
|
|
40
|
-
- `
|
|
41
|
-
- `
|
|
42
|
-
- `
|
|
43
|
-
- `
|
|
44
|
-
- `
|
|
45
|
-
- `
|
|
58
|
+
- `urlRoot: string` — URL base cho API.
|
|
59
|
+
- `headers: Record<string, string>` — các header yêu cầu mặc định.
|
|
60
|
+
- `requestDefault: Record<string, any>` — dữ liệu yêu cầu mặc định.
|
|
61
|
+
- `preparation: (apiFetch: ApiFetch) => Promise<void>` — hook đầu vào (entry hook).
|
|
62
|
+
- `end: (query: Response, apiFetch: ApiFetch) => Promise<ApiPreparationEnd>` — hook đầu ra (exit hook).
|
|
63
|
+
- `timeout: number` — timeout toàn cục tính bằng mili giây.
|
|
46
64
|
|
|
47
|
-
|
|
65
|
+
## Kiến trúc Proxy
|
|
48
66
|
|
|
49
|
-
|
|
50
|
-
- `get<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu HTTP GET.
|
|
51
|
-
- `post<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu HTTP POST.
|
|
52
|
-
- `put<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu HTTP PUT.
|
|
53
|
-
- `delete<T>(request: ApiFetch): Promise<T>` — Gửi yêu cầu HTTP DELETE.
|
|
67
|
+
Lớp `Api` hoạt động như một **Proxy tĩnh**. Tất cả các lệnh gọi phương thức đều được chuyển hướng đến một `ApiInstance` nội bộ.
|
|
54
68
|
|
|
55
|
-
|
|
69
|
+
### Quản lý Instance
|
|
56
70
|
|
|
57
|
-
|
|
71
|
+
Trình quản lý nội bộ được lưu trữ trong `ServerStorage` bằng một khóa duy nhất (`__dxt_api_instance__`). Kiến trúc này giải quyết hai vấn đề lớn:
|
|
58
72
|
|
|
59
|
-
|
|
60
|
-
|
|
73
|
+
1. **An toàn luồng trong SSR**: Trong quá trình render phía máy chủ, `ServerStorage` đảm bảo rằng mỗi yêu cầu đến có cấu hình và trạng thái API riêng biệt, ngăn chặn rò rỉ dữ liệu giữa các người dùng.
|
|
74
|
+
2. **Sự đơn giản của Singleton trên Client**: Ở phía client, nó hoạt động như một singleton thực sự, cho phép bạn cấu hình API tại điểm truy cập và sử dụng nó ở bất cứ đâu mà không cần truyền instance.
|
|
61
75
|
|
|
62
|
-
|
|
63
|
-
urlRoot: 'https://api.example.com/v1/',
|
|
64
|
-
headers: { 'Authorization': 'Bearer token123' },
|
|
65
|
-
requestDefault: { source: 'webapp' },
|
|
66
|
-
preparation: async (apiFetch) => {
|
|
67
|
-
console.log('Chuẩn bị:', apiFetch.path)
|
|
68
|
-
},
|
|
69
|
-
end: async (response, apiFetch) => {
|
|
70
|
-
if (response.status === 401) {
|
|
71
|
-
return { reset: true }
|
|
72
|
-
}
|
|
73
|
-
return {}
|
|
74
|
-
}
|
|
75
|
-
})
|
|
76
|
-
```
|
|
76
|
+
### Ủy quyền (Delegation)
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
Mặc dù `Api` là giao diện được ưu tiên cho logic ứng dụng tiêu chuẩn, nhưng logic cốt lõi (thử lại, logic hydration, jitter) nằm bên trong `ApiInstance`. Đối với các tình huống nâng cao liên quan đến nhiều URL base hoặc các bộ header khác nhau đồng thời, bạn có thể khởi tạo `ApiInstance` trực tiếp.
|