Skip to content

Commit 792ba32

Browse files
Solantillright
andauthored
Add ru and ja translations for api-requests page (#828)
* feat: add translation banner for documentation with multilingual support * docs: add ru translation * docs: add Japanese API requests guide * fix: use anchor instead of Link to prevent build error * docs: remove machine translated page * fix: apply review suggestion Co-authored-by: Lev Chelyadinov <illright@proton.me> * fix: apply review suggestion Co-authored-by: Lev Chelyadinov <illright@proton.me> * fix: apply review suggestion Co-authored-by: Lev Chelyadinov <illright@proton.me> * fix: apply review suggestion Co-authored-by: Lev Chelyadinov <illright@proton.me> * fix: apply review suggestion Co-authored-by: Lev Chelyadinov <illright@proton.me> * fix: add reference to React Query article in API requests guide --------- Co-authored-by: Lev Chelyadinov <illright@proton.me>
1 parent 24c84f9 commit 792ba32

File tree

2 files changed

+149
-5
lines changed

2 files changed

+149
-5
lines changed

i18n/en/docusaurus-plugin-content-docs/current/guides/examples/api-requests.mdx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ sidebar_position: 4
55
import Tabs from '@theme/Tabs';
66
import TabItem from '@theme/TabItem';
77

8-
# Handling API Requests
8+
# Handling API Requests {#handling-api-requests}
99

10-
## Shared API Requests
10+
## Shared API Requests {#shared-api-requests}
1111

1212
Start by placing common API request logic in the `shared/api` directory. This makes it easy to reuse requests across your application and helps with faster prototyping. For many projects, this is all you'll need for API calls.
1313

@@ -93,7 +93,7 @@ export { login } from './endpoints/login';
9393
export type { LoginCredentials } from './endpoints/login';
9494
```
9595

96-
## Slice-Specific API Requests
96+
## Slice-Specific API Requests {#slice-specific-api-requests}
9797

9898
If an API request is only used by a specific slice (like a single page or feature) and won't be reused, place it in the api segment of that slice. This keeps slice-specific logic neatly contained.
9999

@@ -126,14 +126,16 @@ Avoid placing API calls and response types in the `entities` layer prematurely.
126126

127127
:::
128128

129-
## Using Client Generators
129+
## Using Client Generators {#client-generators}
130130

131131
If your backend has an OpenAPI specification, tools like [orval](https://orval.dev/) or [openapi-typescript](https://openapi-ts.dev/) can generate API types and request functions for you. Place the generated code in, for example, `shared/api/openapi`. Make sure to include `README.md` to document what those types are, and how to generate them.
132132

133-
## Integrating with Server State Libraries
133+
## Integrating with Server State Libraries {#server-state-libraries}
134134

135135
When using server state libraries like [TanStack Query (React Query)](https://tanstack.com/query/latest) or [Pinia Colada](https://pinia-colada.esm.dev/) you might need to share types or cache keys between slices. Use the `shared` layer for things like:
136136

137137
- API data types
138138
- Cache keys
139139
- Common query/mutation options
140+
141+
For more details on how to work with server state libraries, refer to [React Query article](/docs/guides/tech/with-react-query)
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
---
2+
sidebar_position: 4
3+
---
4+
5+
import Tabs from '@theme/Tabs';
6+
import TabItem from '@theme/TabItem';
7+
8+
# Обработка API-запросов {#handling-api-requests}
9+
10+
## API-запросы в `shared` {#shared-api-requests}
11+
12+
Начните с размещения общей логики API-запросов в каталоге `shared/api`. Это упрощает повторное использование запросов во всем приложении, что ускоряет разработку. Для многих проектов этого будет достаточно.
13+
14+
Типичная структура файлов будет такой:
15+
- 📂 shared
16+
- 📂 api
17+
- 📄 client.ts
18+
- 📄 index.ts
19+
- 📂 endpoints
20+
- 📄 login.ts
21+
22+
Файл `client.ts` централизует настройку HTTP-запросов. Он оборачивает выбранный вами подход (например, `fetch()` или экземпляр `axios`) и обрабатывает общие конфигурации, такие как:
23+
24+
- Базовый URL бэкенда.
25+
- Заголовки по умолчанию (например, для аутентификации).
26+
- Сериализация данных.
27+
28+
Вот примеры для `axios` и `fetch`:
29+
30+
<Tabs>
31+
32+
<TabItem value="axios" label="Axios">
33+
```ts title="shared/api/client.ts"
34+
// Example using axios
35+
import axios from 'axios';
36+
37+
export const client = axios.create({
38+
baseURL: 'https://your-api-domain.com/api/',
39+
timeout: 5000,
40+
headers: { 'X-Custom-Header': 'my-custom-value' }
41+
});
42+
```
43+
</TabItem>
44+
45+
<TabItem value="fetch" label="Fetch">
46+
```ts title="shared/api/client.ts"
47+
export const client = {
48+
async post(endpoint: string, body: any, options?: RequestInit) {
49+
const response = await fetch(`https://your-api-domain.com/api${endpoint}`, {
50+
method: 'POST',
51+
body: JSON.stringify(body),
52+
...options,
53+
headers: {
54+
'Content-Type': 'application/json',
55+
'X-Custom-Header': 'my-custom-value',
56+
...options?.headers,
57+
},
58+
});
59+
return response.json();
60+
}
61+
// ... другие методы put, delete, и т.д.
62+
};
63+
```
64+
</TabItem>
65+
66+
</Tabs>
67+
68+
Организуйте свои отдельные функции API-запросов в shared/api/endpoints, группируя их по API эндпоинтам.
69+
70+
:::note
71+
72+
Для простоты, в примерах ниже мы опускаем взаимодействие с формами и валидацию. Для получения подробной информации о том, как работать с такими библиотеками как Zod или Valibot, обратитесь к секции [Проверка типов и схемы](/docs/guides/examples/types#type-validation-schemas-and-zod).
73+
74+
:::
75+
76+
```ts title="shared/api/endpoints/login.ts"
77+
import { client } from '../client';
78+
79+
export interface LoginCredentials {
80+
email: string;
81+
password: string;
82+
}
83+
84+
export function login(credentials: LoginCredentials) {
85+
return client.post('/login', credentials);
86+
}
87+
```
88+
89+
Используйте файл `index.ts` в `shared/api` для экспорта ваших функций запросов.
90+
91+
```ts title="shared/api/index.ts"
92+
export { client } from './client'; // Если нужно экспортировать клиент
93+
export { login } from './endpoints/login';
94+
export type { LoginCredentials } from './endpoints/login';
95+
```
96+
97+
## API-запросы, специфичные для слайса {#slice-specific-api-requests}
98+
99+
Если API-запрос используется только определенным слайсом (например, одной страницей или фичей) и не будет использоваться повторно, поместите его в сегмент `api` этого слайса. Это позволит аккуратно отделить логику, специфичную для слайса, от всего остального приложения.
100+
101+
- 📂 pages
102+
- 📂 login
103+
- 📄 index.ts
104+
- 📂 api
105+
- 📄 login.ts
106+
- 📂 ui
107+
- 📄 LoginPage.tsx
108+
109+
```ts title="pages/login/api/login.ts"
110+
import { client } from 'shared/api';
111+
112+
interface LoginCredentials {
113+
email: string;
114+
password: string;
115+
}
116+
117+
export function login(credentials: LoginCredentials) {
118+
return client.post('/login', credentials);
119+
}
120+
```
121+
122+
Вам не нужно экспортировать функцию `login()` через публичный API страницы, потому что маловероятно, что какое-либо другое место в приложении будет нуждаться в этом запросе.
123+
124+
:::note
125+
126+
Избегайте преждевременного размещения API-запросов и типов ответов бэкенда в слое `entities`. Ответы бэкенда могут отличаться от того, что нужно вашим сущностям фронтенда. Логика API в `shared/api` или сегменте `api` слайса позволяет вам преобразовывать данные при необходимости, сохраняя фокус сущностей на проблемах фронтенда.
127+
128+
:::
129+
130+
## Использование генераторов клиентов {#client-generators}
131+
132+
Если ваш бэкенд предоставляет OpenAPI спецификацию, инструменты как [orval](https://orval.dev/) или [openapi-typescript](https://openapi-ts.dev/), могут генерировать типы API и функции запросов. Разместите сгенерированный код, например, в `shared/api/openapi`. Обязательно включите `README.md` для документирования того, что это за типы и как их генерировать.
133+
134+
## Интеграция с библиотеками состояния сервера {#server-state-libraries}
135+
136+
При использовании библиотек состояния сервера, таких как [TanStack Query (React Query)](https://tanstack.com/query/latest) или [Pinia Colada](https://pinia-colada.esm.dev/) вам может потребоваться совместное использование типов или ключей кеша между срезами. Используйте общий слой `shared` для таких вещей, как:
137+
138+
- Типы данных API
139+
- Ключи кеша
140+
- Общие параметры запросов и мутаций
141+
142+
Подробнее о том, как работать с server state библиотеками, читайте в статье [React Query](/docs/guides/tech/with-react-query)

0 commit comments

Comments
 (0)