Використання SDK

← Використання SDK

Ashterix

docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api

uk/docs/api/sdk/client/usage.md новий файл +99 −0

Використання SDK

Згенерований клас процедури — звичайний PHP-клас. У Symfony з SDK Bundle його достатньо отримати через автовайринг; без бандла — створити вручну.

Синхронний виклик

use App\Sdk\Orders\UserSDK;

$users = new UserSDK(headers: ['Ufo-RPC-Token' => $token]);

$user = $users->get(5);          // App\Sdk\Orders\DTO\UserDto
$list = $users->list(page: 2);   // UserDto[]

Конструктор:

new UserSDK(
    array $headers = [],                       // HTTP-заголовки, зокрема токен
    string|int|null $requestId = null,         // id запиту; за замовчуванням uniqid()
    string $rpcVersion = '2.0',
    ?HttpClientInterface $httpClient = null,   // власний Symfony HttpClient
    array $httpRequestOptions = [],            // опції HttpClient (timeout, proxy, ...)
    ?IRpcSpecialParamHandler $rpcSpecialParams = null,
    iterable $handlers = [],                   // обробники відповіді; порожньо — стандартні
    string $transportName = 'sync',            // ключ адреси в sdk_config.yaml
)

Назва заголовка з токеном не фіксована — вона така, як на сервері (security.token_name, за замовчуванням Ufo-RPC-Token).

Адреса сервера

Адреса береться з sdk_config.yaml (якщо є) або sdk_config.yaml.dist поруч із класами — за назвою постачальника (останній сегмент простору імен класу) і transportName. Немає запису — ConfigNotFoundException.

Fluent-методи

Метод Що робить
withHeaders(array $headers) Додати заголовки до наступних запитів (лише синхронні класи)
withoutCache() / withCache() Передати серверу $rpc.ignoreCache: true / false — обійти або використати кеш відповіді
rayId(string $id) Передати $rpc.rayId для трасування ланцюжка запитів
setId(string|int $id) / setRequestId() Задати id запиту
resetConfig() Скинути спеціальні параметри
$user = $users->withoutCache()->rayId($traceId)->get(5);

Синхронні класи скидають спеціальні параметри й генерують новий id після кожного успішного запиту. Кожен запит містить $rpc (timeout, ignoreCache і, якщо задано, rayId, callback); сервери на JsonRpcBundle його розуміють, інші сервери отримують додатковий параметр.

Результат

Тип результату визначається з @return згенерованого методу, і відповідь сервера перетворюється на нього ланцюжком обробників:

Обробник Пріоритет Що перетворює
EnumResponseHandler 100 значення → case enum
UnionResponseHandler 80 union-типи
CollectionResponseHandler 60 масиви елементів
DtoResponseHandler 20 об'єкти → DTO

Власні обробники — див. Розширення.

Помилки

  • Валідація параметрів виконується до запиту за обмеженнями з документації сервера. Порушення — Ufo\RpcError\ConstraintsImposedException (або інший AbstractRpcErrorException за кодом) без обгортки.
  • Помилки сервера й транспорту загортаються в Ufo\RpcSdk\Exceptions\SdkException: його getCode() — код помилки JSON-RPC, а типізований виняток rpc-exceptions (наприклад, RpcDataNotFoundException для -32404) — у getPrevious().
use Ufo\RpcError\RpcDataNotFoundException;
use Ufo\RpcSdk\Exceptions\SdkException;

try {
    $user = $users->get($id);
} catch (SdkException $e) {
    if ($e->getPrevious() instanceof RpcDataNotFoundException) {
        // користувача немає
    }
    throw $e;
}

Не ловіть RpcDataNotFoundException та інші винятки rpc-exceptions напряму — з синхронного виклику вони не вилітають, лише всередині SdkException.

Batch і notifications

SDK надсилає лише одиночні запити з id. Batch і notifications через згенеровані класи не підтримуються.

Налагодження

Ufo\RpcSdk\Procedures\RequestResponseStack::getAll() повертає всі запити, заголовки й відповіді поточного процесу.

getLastStack(), getLastRequest() і getLastResponse() у 5.0.2 працюють неправильно — див. Актуальні помилки. Використовуйте getAll().