Параметри запиту
REST-запит перетворюється на один виклик RPC-методу. Параметри методу збираються з кількох джерел і далі обробляються ядром RPC так само, як параметри JSON-RPC запиту: значення за замовчуванням, DTO й конвертація типів, #[RPC\Assertions].
Джерела параметрів
Джерела об'єднуються в такому порядку; пізніший ключ перекриває попередній:
- змінні шляху маршруту;
- query string;
- поля форми (
application/x-www-form-urlencoded,multipart/form-data); - JSON-тіло.
PUT /rest/catalog/items/42?title=query
Content-Type: application/json
{"title": "Book"}
викликає catalog.update з {"id": 42, "title": "Book"} (для int $id).
Правила:
- Порожнє тіло — параметрів з тіла немає.
- З
Content-Typeформи тіло не розбирається як JSON. - Тіло, що не є коректним JSON, повертає
400зdetailInvalid JSON request body; JSON, що не є об'єктом чи масивом (null,42,"text"), —400зJSON request body must be an object or array. - Службові значення маршруту не передаються в метод:
api_group,ver,rpcRoute,_rest_route,_rest_name_prefix,_rest_doc,_ver,_controller,_format,_locale,_stateless.
Масиви, об'єкти й DTO передавайте в JSON-тілі.
Приведення типів
З версії 1.3. У 1.0–1.2 значення зі шляху, query і форми лишались рядками, і для параметрів int, float, bool ядро RPC повертало помилку типу.
Значення зі шляху, query і форми завжди рядки. Перед об'єднанням кожне з них приводиться до оголошеного типу параметра методу з тією самою назвою. Значення з JSON-тіла зберігають свої JSON-типи й не приводяться.
| Тип параметра | Приводиться | Лишається рядком |
|---|---|---|
string, mixed, union зі string (int|string) |
ніколи — рядок допустимий | |
nullable (?int, ?bool, int|null) |
"" → null |
|
int |
цілочисловий літерал: 42, -7, 0 |
007, +1, 1, 1.5, поза межами int |
float |
числовий рядок: 1.5, 2, 1e3 |
1,5 |
int|float |
2 → 2, 2.5 → 2.5 |
|
bool |
true, 1 → true; false, 0 → false (без урахування регістру) |
yes, on, "" |
enum, array, клас |
ніколи |
#[Route('/items/{id}', name: 'item', methods: ['GET'])]
public function item(int $id, bool $full = false): array {} // GET /rest/catalog/items/42?full=true
Значення, яке не вдалося привести, лишається рядком, і ядро RPC повертає 400 з повідомленням про тип у detail-data. Параметри, яких немає в сигнатурі методу, не змінюються.
Параметри-enum ядро RPC не конвертує з рядка — ні в REST, ні в JSON-RPC. Див. Актуальні помилки.
Відповідь
- Успіх — статус
200,Content-Type: application/json, тіло — результат методу без JSON-RPC обгортки. - Помилка — HTTP-статус помилки і документ RFC 9457, див. Обробка помилок.
Що працює з ядра RPC
REST-виклик виконується через RpcExecutor JsonRpcBundle (з 1.3), тому для нього діють:
- конвертація параметрів, значення за замовчуванням,
#[RPC\Assertions]і валідація DTO; - кеш відповідей
#[RPC\Cache]та інвалідація#[RPC\CacheRelation](наrpc.post_response); #[RPC\Lock];- лістенери подій
rpc.*застосунку; #[Autowire]в аргументах методу.
Через REST недоступні batch, notifications і $rpc.callback.
До 1.3 REST-виклик не генерував rpc.post_response, тож інвалідація #[RPC\CacheRelation] і post-response лістенери для REST не спрацьовували.