Skip to content

Commit 5e0a217

Browse files
2 parents 3ec5a6a + 272cf3b commit 5e0a217

File tree

4 files changed

+359
-1
lines changed

4 files changed

+359
-1
lines changed
File renamed without changes.

ApiDocJs/shared/header.template.ru.md

Lines changed: 347 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,347 @@
1+
## **Обзор**
2+
3+
Вот некоторая информация, которая должна помочь вам понять основы использования нашего RESTful API. Включая информацию об аутентификации пользователей, выполнении запросов, ответов,
4+
потенциальных ошибках, ограничении скорости, нумерации страниц, параметрах запроса и многом другом.
5+
6+
## **Заголовки**
7+
8+
Некоторые вызовы API требуют, чтобы вы отправляли данные в определенном формате.
9+
По умолчанию все вызовы API ожидают ввода в JSONформате, однако вам необходимо сообщить серверу,
10+
что вы ожидаете полезную нагрузку в формате JSON.
11+
А для этого вы должны включать Accept => application/json HTTP-заголовок при каждом вызове.
12+
13+
14+
| Заголовок | Образенц значения | Когда отправлять |
15+
|---------------|-------------------------------------|--------------------------------------------------------------------|
16+
| Accept | `application/json` | ДОЛЖЕН быть в КАЖДОМ запросе |
17+
| Content-Type | `application/x-www-form-urlencoded` | ДОЛЖЕН быть отправлен при передаче данных |
18+
| Authorization | `Bearer {Access-Token-Here}` | ДОЛЖЕН быть отправлен всякий раз, когда запрос требует авторизации |
19+
20+
## **Rate limiting**
21+
22+
Все запросы REST API регулируются для предотвращения злоупотреблений и обеспечения стабильности.
23+
Точное количество вызовов, которое ваше приложение может совершать в день, зависит от типа отправляемого вами запроса.
24+
25+
Окно ограничения скорости составляет `{{rate-limit-expires}}` минут на endpoint, при этом большинство отдельных вызовов допускают `{{rate-limit-attempts}}` запросов в каждом окне.
26+
27+
*Другими словами, каждому пользователю разрешено совершать `{{rate-limit-attempts}}` вызовов на endpoint каждые `{{rate-limit-expires}}` минут. (Для каждого уникального токена доступа).*
28+
29+
Сколько запросов вы можете выполнить на endpoint, вы всегда можете проверить в заголовке:
30+
31+
```
32+
X-RateLimit-Limit → 30
33+
X-RateLimit-Remaining → 29
34+
```
35+
36+
## **Tokens**
37+
38+
Токен доступа действителен `{{access-token-expires-in}}`. (`{{access-token-expires-in-minutes}}` минут).
39+
Refresh Token действителен `{{refresh-token-expires-in}}`. (`{{refresh-token-expires-in-minutes}}` минут).
40+
41+
*Вам нужно будет повторно аутентифицировать пользователя, когда срок действия токена истечет.*
42+
43+
## **Pagination**
44+
45+
По умолчанию, все запросы с пагинацией возвращают первые `{{pagination-limit}}` элементов в списке. Прочтите раздел **Query Parameters**, чтобы узнать, как управлять нумерацией страниц.
46+
47+
48+
49+
## **Limit:**
50+
51+
Параметр `?limit=` может быть применен для указания сколько записей должно быть возвращено в ответе (Прочтите раздел `Pagination`!).
52+
53+
**Использование:**
54+
55+
```
56+
api.domain.test/v1/endpoint?limit=100
57+
```
58+
59+
Приведенный выше пример возвращает 100 ресурсов.
60+
61+
Параметры запроса `limit` и `page` можно комбинировать, чтобы получить следующие 100 ресурсов:
62+
63+
```
64+
api.domain.test/v1/endpoint?limit=100&page=2
65+
```
66+
67+
Вы можете отключить ограничение пагинацию, чтобы получить все данные, указав `?limit=0`, это будет работать только в том случае, если на сервере включен параметр 'skip pagination'.
68+
69+
## **Responses**
70+
71+
Если не указано иное, все конечные точки API будут возвращать запрашиваемую вами информацию в формате JSON.
72+
73+
74+
#### Standard Response Format
75+
76+
```json
77+
{
78+
"data": {
79+
"object": "Role",
80+
"id": "owpmaymq",
81+
"name": "admin",
82+
"description": "Administrator",
83+
"display_name": null,
84+
"permissions": {
85+
"data": [
86+
{
87+
"object": "Permission",
88+
"id": "wkxmdazl",
89+
"name": "update-users",
90+
"description": "Update a User.",
91+
"display_name": null
92+
},
93+
{
94+
"object": "Permission",
95+
"id": "qrvzpjzb",
96+
"name": "delete-users",
97+
"description": "Delete a User.",
98+
"display_name": null
99+
}
100+
]
101+
}
102+
}
103+
}
104+
```
105+
106+
#### Header
107+
108+
Header Response:
109+
110+
```
111+
Content-Type → application/json
112+
Date → Thu, 14 Feb 2014 22:33:55 GMT
113+
ETag → "9c83bf4cf0d09c34782572727281b85879dd4ff6"
114+
Server → nginx
115+
Transfer-Encoding → chunked
116+
X-Powered-By → PHP/7.0.9
117+
X-RateLimit-Limit → 100
118+
X-RateLimit-Remaining → 99
119+
```
120+
121+
## **Query Parameters**
122+
123+
Параметры запроса являются необязательными, вы можете применить их к некоторым конечным точкам, когда они вам понадобятся.
124+
125+
### Ordering
126+
127+
Параметр `?orderBy=` может применяться к любому **`GET`** HTTP запросу чтобы упорядочить список записей в ответе по полю.
128+
129+
**Использование:**
130+
131+
```
132+
api.domain.test/v1/endpoint?orderBy=created_at
133+
```
134+
135+
### Sorting
136+
137+
Параметр `?sortedBy=` обычно используется вместе с `orderBy`.
138+
139+
По умолчанию `orderBy` сортирует данные в порядке **возрастания** если вы хотите, чтобы данные сортировались в порядке **убывания**, вы можете добавить `&sortedBy=desc`.
140+
141+
**Использование:**
142+
143+
```
144+
api.domain.test/v1/endpoint?orderBy=name&sortedBy=desc
145+
```
146+
147+
Доступные параметры сортировки:
148+
149+
- `asc` для сортировки по Возрастанию.
150+
- `desc` для сортировки по Убыванию.
151+
152+
### Поиск
153+
154+
Если [RequestCriteria](http://apiato.io/docs/core-features/query-parameters#using-the-request-criteria)
155+
включен для маршрута, то `?search=` параметр может быть использован для этого **`GET`** HTTP запроса.
156+
157+
**Использование:**
158+
159+
#### Поиск по любому из полей:
160+
161+
```
162+
api.domain.test/v1/endpoint?search=keyword here
163+
```
164+
165+
> Пробел нужно заменить на спецсимвол `%20` (search=keyword%20here).
166+
167+
#### Поиск в любом поле по нескольким ключевым словам:
168+
169+
```
170+
api.domain.test/v1/endpoint?search=first keyword;second keyword
171+
```
172+
173+
#### Поиск по определённому полю:
174+
```
175+
api.domain.test/v1/endpoint?search=field:keyword here
176+
```
177+
178+
#### Поиск в определенных полях по нескольким ключевым словам:
179+
```
180+
api.domain.test/v1/endpoint?search=field1:first field keyword;field2:second field keyword
181+
```
182+
183+
#### Условия запроса:
184+
185+
```
186+
api.domain.test/v1/endpoint?search=field:keyword&searchFields=name:like
187+
```
188+
189+
Доступные условия:
190+
191+
- `like`: строка похожа на образец. (SQL query `%keyword%`).
192+
- `=`: точное совпадение строки.
193+
194+
195+
#### Определить условия запроса для нескольких полей:
196+
197+
```
198+
api.domain.test/v1/endpoint?search=field1:first keyword;field2:second keyword&searchFields=field1:like;field2:=;
199+
```
200+
201+
#### Комбинированный поиск:
202+
По умолчанию, поиск выполняется используя оператор сравнения ИЛИ для каждого параметра запроса.
203+
204+
```
205+
api.domain.test/v1/endpoint?search=age:17;email:john@gmail.com
206+
```
207+
208+
В приведенном выше примере будет выполнен следующий запрос:
209+
210+
```sql
211+
SELECT * FROM users WHERE age = 17 OR email = 'john@gmail.com';
212+
```
213+
Чтобы он выполнял запрос с использованием И, передайте `searchJoin` параметр, как показано ниже:
214+
215+
```
216+
api.domain.test/v1/endpoint?search=age:17;email:john@gmail.com&searchJoin=and
217+
```
218+
219+
### Фильтрация
220+
221+
Параметр `?filter=` может применяться к любому HTTP-запросу. И используется для управления размером ответа, определяя, какие данные вы хотите включить в ответ.
222+
223+
**Использование:**
224+
225+
Возвращает только ID и Status из модели.
226+
227+
```
228+
api.domain.test/v1/endpoint?filter=id;status
229+
```
230+
231+
Пример ответа, включающий только идентификатор и статус:
232+
233+
```json
234+
{
235+
"data": [
236+
{
237+
"id": "0one37vjk49rp5ym",
238+
"status": "approved",
239+
"products": {
240+
"data": [
241+
{
242+
"id": "bmo7y84xpgeza06k",
243+
"status": "pending"
244+
},
245+
{
246+
"id": "o0wzxbg0q4k7jp9d",
247+
"status": "fulfilled"
248+
}
249+
]
250+
},
251+
"recipients": {
252+
"data": [
253+
{
254+
"id": "r6lbekg8rv5ozyad"
255+
}
256+
]
257+
},
258+
"store": {
259+
"data": {
260+
"id": "r6lbekg8rv5ozyad"
261+
}
262+
}
263+
}
264+
]
265+
}
266+
```
267+
268+
269+
### Пагинация
270+
271+
Параметр `?page=` может быть применен к любому **`GET`** HTTP-запросу возвращающему много записей в ответе (в основном для разбивки на страницы).
272+
273+
**Использование:**
274+
275+
```
276+
api.domain.test/v1/endpoint?page=200
277+
```
278+
279+
*Объект пагинации всегда возвращается в объекте **meta** если разбиение на страницы доступно для эндпоинта.*
280+
281+
```json
282+
"data": [...],
283+
"meta": {
284+
"pagination": {
285+
"total": 2000,
286+
"count": 30,
287+
"per_page": 30,
288+
"current_page": 22,
289+
"total_pages": 1111,
290+
"links": {
291+
"previous": "http://api.domain.test/v1/endpoint?page=21"
292+
}
293+
}
294+
}
295+
```
296+
297+
### Отношения
298+
299+
Параметр `?include=` может быть использован с любым поддерживаемым его эндпоинтом.
300+
301+
Как использовать: допустим, есть объект Driver и объект Car. И есть эндпоинт `/cars` который возвращает все объекты cars.
302+
Параметр `?include=` позволяет получить автомобили с их водителями `/cars?include=drivers`.
303+
304+
Однако для того, чтобы этот параметр работал, эндпоинт `/cars` должен чётко определить, что он принимает
305+
`driver` в качестве отношения (отображается в `include` объекте ответа).
306+
307+
**Использование:**
308+
309+
```
310+
api.domain.test/v1/endpoint?include=relationship
311+
```
312+
313+
Каждый ответ содержит `include` в объекте `meta`:
314+
315+
```
316+
"meta":{
317+
"include":[
318+
"relationship-1",
319+
"relationship-2",
320+
],
321+
```
322+
323+
324+
### Кэширование
325+
326+
Некоторые конечные точки сохраняют свои данные ответа в памяти (кэше) после первого запроса, чтобы ускорить время ответа.
327+
Параметр `?skipCache=` можно использовать, чтобы принудительно пропустить загрузку данных ответа из кэша сервера и вместо этого получить свежие данные из базы данных по запросу.
328+
329+
**Использование:**
330+
331+
```
332+
api.domain.test/v1/endpoint?skipCache=true
333+
```
334+
335+
## **Requests**
336+
337+
Пример вызова эндпойнта без авторизации:
338+
339+
```shell
340+
curl -X POST -H "Accept: application/json" -H "Content-Type: application/x-www-form-urlencoded; -F "email=admin@admin.com" -F "password=admin" -F "=" "http://api.domain.test/v2/register"
341+
```
342+
343+
Пример вызова эндпойнта с авторизацией (передача Bearer Token):
344+
345+
```shell
346+
curl -X GET -H "Accept: application/json" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." -H "http://api.domain.test/v1/users"
347+
```

Configs/vendor-documentation.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
<?php
22

33
return [
4+
5+
/*
6+
|--------------------------------------------------------------------------
7+
| Locale
8+
|--------------------------------------------------------------------------
9+
|
10+
| Language header docs
11+
|
12+
*/
13+
14+
'locale' => '.'.env('APIDOC_LOCALE', 'en'),
415

516
/*
617
|--------------------------------------------------------------------------

Tasks/RenderTemplatesTask.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class RenderTemplatesTask extends Task
1515

1616
public function __construct()
1717
{
18-
$this->templatePath = 'Containers/' . config('vendor-documentation.section_name') . '/Documentation/ApiDocJs/shared/header.template.md';
18+
$this->templatePath = 'Containers/' . config('vendor-documentation.section_name') . '/Documentation/ApiDocJs/shared/header.template'.config('vendor-documentation.locale', 'en').'.md';
1919
$this->outputPath = 'Containers/' . config('vendor-documentation.section_name') . '/Documentation/UI/WEB/Views/documentation/header.md';
2020
$this->replaceArray = [
2121
'api.domain.test' => config('apiato.api.url'),

0 commit comments

Comments
 (0)