JsonRpcClientSdk
Остання зміна 2024/05/27 10:35 автором Ashterix
Проста бібліотека, що генерує SDK для звертання до сторонніх сервісів, що працюють по протоколу Json-RPC API з бібліотекою JsonRpcBundle. Генератор зчитує Json документацію API та створює зручні класи-сервіси і типізовані DTO класи відповідей.
Генерація SDK
Запустіть інтерактивну CLI команду php bin/make.php, введіть назву сервісу та url, по якому доступна документація.
php bin/make.php
> Enter API vendor name: some_vendor
> Enter the API url: http://some.url/api
> Enter API vendor name: some_vendor
> Enter the API url: http://some.url/api
Приклад використання SDK
Цей приклад демонструє роботу зі згенерованим SDK.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
use Symfony\Component\HttpClient\CurlHttpClient;
use Ufo\RpcSdk\Client\Shortener\UserProcedure;
use Ufo\RpcSdk\Client\Shortener\PingProcedure;
use Ufo\RpcSdk\Procedures\AbstractProcedure;
require_once __DIR__ . '/../vendor/autoload.php';
$headers = [
'Ufo-RPC-Token'=>'some_security_token'
];
try {
$pingService = new PingProcedure(
headers: $headers
);
echo $pingService->ping(); // print "PONG"
// ...
$userService = new UserProcedure(
headers: $headers,
requestId: uniqid(),
rpcVersion: AbstractProcedure::DEFAULT_RPC_VERSION,
httpClient: new CurlHttpClient(),
httpRequestOptions: []
);
$user = $userService->createUser(
login: 'some_login',
password: 'some_password'
);
var_dump($user);
// array(3) {
// ["id"]=> int(279232969)
// ["login"]=> string(3) "some_login"
// ["status"]=> int(0)
} catch (\Throwable $e) {
echo $e->getMessage() . PHP_EOL;
}
// ...
use Symfony\Component\HttpClient\CurlHttpClient;
use Ufo\RpcSdk\Client\Shortener\UserProcedure;
use Ufo\RpcSdk\Client\Shortener\PingProcedure;
use Ufo\RpcSdk\Procedures\AbstractProcedure;
require_once __DIR__ . '/../vendor/autoload.php';
$headers = [
'Ufo-RPC-Token'=>'some_security_token'
];
try {
$pingService = new PingProcedure(
headers: $headers
);
echo $pingService->ping(); // print "PONG"
// ...
$userService = new UserProcedure(
headers: $headers,
requestId: uniqid(),
rpcVersion: AbstractProcedure::DEFAULT_RPC_VERSION,
httpClient: new CurlHttpClient(),
httpRequestOptions: []
);
$user = $userService->createUser(
login: 'some_login',
password: 'some_password'
);
var_dump($user);
// array(3) {
// ["id"]=> int(279232969)
// ["login"]=> string(3) "some_login"
// ["status"]=> int(0)
} catch (\Throwable $e) {
echo $e->getMessage() . PHP_EOL;
}
// ...
Налагодження запитів та відповідей
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
// ...
use Ufo\RpcSdk\Procedures\RequestResponseStack;
// ...
$fullStack = RequestResponseStack::getAll(); // отримати всі попередні запити та відповіді
$lastStack = RequestResponseStack::getLastStack(); // отримати останні запити та відповіді
$lastRequest = RequestResponseStack::getLastRequest(); // отримати останній запит
$lastResponse = RequestResponseStack::getLastResponse(); // отримати останню відповідь
// ...
// ...
use Ufo\RpcSdk\Procedures\RequestResponseStack;
// ...
$fullStack = RequestResponseStack::getAll(); // отримати всі попередні запити та відповіді
$lastStack = RequestResponseStack::getLastStack(); // отримати останні запити та відповіді
$lastRequest = RequestResponseStack::getLastRequest(); // отримати останній запит
$lastResponse = RequestResponseStack::getLastResponse(); // отримати останню відповідь
// ...
Власні налаштування генератору
Ви можете генерувати SDK і у власний спосіб.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
use Ufo\RpcSdk\Maker\Maker;
require_once __DIR__ . '/../vendor/autoload.php';
$maker = new Maker(
apiUrl: $apiUrl,
apiVendorAlias: $vendorName,
namespace: Maker::DEFAULT_NAMESPACE, // 'Ufo\RpcSdk\Client'
projectRootDir: getcwd(), // project_dir
cacheLifeTimeSecond: Maker::DEFAULT_CACHE_LIFETIME // 3600
);
$maker->make();
use Ufo\RpcSdk\Maker\Maker;
require_once __DIR__ . '/../vendor/autoload.php';
$maker = new Maker(
apiUrl: $apiUrl,
apiVendorAlias: $vendorName,
namespace: Maker::DEFAULT_NAMESPACE, // 'Ufo\RpcSdk\Client'
projectRootDir: getcwd(), // project_dir
cacheLifeTimeSecond: Maker::DEFAULT_CACHE_LIFETIME // 3600
);
$maker->make();
Також ви можете передати callback в метод make для можливої додаткової обробки генерації.
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
//...
$maker->make(function (ClassDefinition $classDefinition) {
// additional traversal of generated classes after generation
});
//...
$maker->make(function (ClassDefinition $classDefinition) {
// additional traversal of generated classes after generation
});