Package Data | |
---|---|
Maintainer Username: | tochka-developers |
Maintainer Contact: | darkdarin@tochka.com (Pavel Babushkin) |
Package Create Date: | 2017-06-08 |
Package Last Update: | 2024-11-14 |
Home Page: | |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2024-12-15 15:01:44 |
Package Statistics | |
---|---|
Total Downloads: | 31,029 |
Monthly Downloads: | 210 |
Daily Downloads: | 1 |
Total Stars: | 25 |
Total Watchers: | 8 |
Total Forks: | 19 |
Total Open Issues: | 0 |
JsonRpc сервер - реализация сервера по спецификации JsonRpc 2.0.
Убрана поддержка Lumen, поддерживается только Laravel 5.6, 5.7 Для старых версий Laravel/Lumen используйте 1.* версии пакета.
Поддерживает:
composer require tochka-developers/jsonrpc
php artisan vendor:publish
При ручной найтройке вы сами контролируете процесс роутинга. Пропишите в вашем route.php:
Route::post('/api/v1/jsonrpc', function (Illuminate\Http\Request $request, \Tochka\JsonRpc\JsonRpcServer $server) {
return $server->handle($request);
});
Если планируется передавать имя контроллера в адресе, после точки входа, роутинги дожны быть следующего вида:
Route::post('/api/v1/jsonrpc/{endpoint}[/{action}]', function (Illuminate\Http\Request $request, \Tochka\JsonRpc\JsonRpcServer $server, $endpoint, $action = null) {
return $server->handle($request, ['endpoint' => $endpoint, 'action' => $action]);
});
Для установки уникальных параметров сервера необходимо передать массив с параметрами в метод handle
:
return $server->handle($request, $options);
uri
('/api/v1/jsonrpc') - точка входаnamespace
('App\Http\Controllers\') - Namespace для контроллеров.
Если не указан - берется значение jsonrpc.controllerNamespace
controller
('Api') - контроллер по умолчанию (для методов без указания контроллера - имяМетода).
Если не указано - берется значение jsonrpc.defaultController
postfix
('Controller') - суффикс контроллеров (для метода foo_bar будет выбран контроллер fooController).
Если не указано - берется значение jsonrpc.controllerPostfix
middleware
(array) - список обработчиков запроса.
В списке обработчиков обязательно должен быть \Tochka\JsonRpc\Middleware\MethodClosureMiddleware::class
,
данный обработчик отвечате за выбор контроллера и метода.
Если список не указан - берется значение jsonrpc.middleware
description
('JsonRpc server') - описание сервиса. Возвращается в SMD-схеме.
Если не указано - берется значение jsonrpc.description
auth
(true) - стандартная авторизация по токены в заголовке.
Если не указано - берется значение jsonrpc.authValidate
acl
(array) - список контроля доступа к методам. Заполняется в виде имяМетода => [serviceName1, serviceName2]
.
Игнорируется, если не включен обработчик AccessControlListMiddleware
.
Если не указано - берется значение jsonrpc.acl
endpoint
(string) - Пространство имён контроллеров. Добавляется к значению параметра namespace.action
(string) - Имя контроллера. Если не указано и при этом указан endpoint, то endpoint является именем контроллера в пространстве namespace.Данный метод более удобен. Для роутинга достаточно перечислить точки входа в параметре jsonrpc.routes
.
[
'/api/v1/jsonrpc', // для этой точки входа будут использованы глобальные настройки
'v2' => [ // для этой точки входа задаются свои настройки. Если какой-то из параметров не указан - используется глобальный
'uri' => '/api/v1/jsonrpc', // URI (обязательный)
'namespace' => 'App\\Http\\Controllers\\V2\\', // Namespace для контроллеров
'controller' => 'Api', // контроллер по умолчанию
'postfix' => 'Controller', // суффикс для имен контроллеров
'middleware' => [], // список обработчиков запросов
'auth' => true, // аутентификация сервиса
'acl' => [], // Список контроля доступа
'description' => 'JsonRpc server V2' // описание для SMD схемы
]
]
Для использования передачи имени контроллера в адресе
[
'v3' => [ // для этой точки входа задаются свои настройки. Если какой-то из параметров не указан - используется глобальный
'uri' => '/api/v3/jsonrpc/{endpoint}[/{action}]', // URI (обязательный)
'namespace' => 'App\\Http\\Controllers\\V3\\', // Namespace для контроллеров
'controller' => 'Api', // контроллер по умолчанию
'postfix' => 'Controller', // суффикс для имен контроллеров
'middleware' => [], // список обработчиков запросов
'auth' => false, // аутентификация сервиса
'acl' => [], // Список контроля доступа
'description' => 'JsonRpc server V3', // описание для SMD схемы
]
]
Каждая точка входа может быть либо строкой с указанием адреса, либо массивом, аналогичном $options.
Обработчики позволяют подготовить запрос, прежде чем вызывать указанный метод. Список обработчиков задается в параметре
jsonrpc.middleware
. Это массив, в котором необходимо перечислить в порядке очереди классы обработчиков.
По умолчанию доступны следующие обработчики:
ValidateJsonRpcMiddleware
Валидация запроса на соответствие спецификации JsonRpc2.0. Рекомендуется использовать.
AccessControlListMiddleware
Контроль доступа к методам.
ServiceValidationMiddleware
Контроль доступа к сервису на основе списка IP-адресов
MethodClosureMiddleware
Обработчик разбирает запрос и находит необходимый контроллер и метод в нем. Данный обработчик обязательно необходимо
включать в список для работы сервера.
AssociateParamsMiddleware
Передача параметров из запроса в метод на основе имен.
Кроме того, вы можете использовать свои обработчики.
Для этого просто реализуйте интерфейс \Tochka\JsonRpc\Middleware\BaseMiddleware
и укажите обработчик в списке.
Если включена аутентификация (jqonrpc.authValidate
), то в каждом запросе должен присутствовать заголовок (указанный в jsonrpc.accessHeaderName
).
Значение заголовка - токен. Список токенов необходимо указать в параметре jsonrpc.keys
:
[
'systemName1' => 'secretToken1',
'systemName2' => 'secretToken2'
]
Если запрос был осуществлен без данного заголовка, либо с токеном, которого нет в списке - клиенту вернется ошибка.
Если аутентификация прошла успешно - клиент будет опознан как systemName1
(systemName2
), что позволит контролировать доступ к методам.
Если аутентификация отклбючена - клиент будет опознан как guest
.
Если включен обработчик ServiceValidationMiddleware
, то будет осуществлен контроль доступа к сервису на основе списка IP-адресов.
Для описания доступа необходимо заполнить параметр jsonrpc.servers
:
[
'systemName1' => ['192.168.0.1', '192.168.1.5'],
'systemName2' => '*',
]
В указанном примере авторизоваться с ключом доступа сервиса systemName1
могут только клиенты с IP адресами
192.168.0.1
и 192.168.1.5
. Сервис systemName2
может авторизовываться с любых IP адресов.
Если включен обработчик AccessControlListMiddleware
, то будет осуществлен контроль доступа к методам.
Для описания доступа необходимо заполнить параметр jsonrpc.acl
:
[
'App\\Http\\TestController1' => [
'*' => '*' // доступ ко всем методам контроллера по умолчанию есть у всех систем
'method1' => ['system1', 'system2'], // но к этому методу есть доступ только у system1 и system2
'method2' => 'system3', // а к этому методу только у system3
]
'App\\Http\\TestController2' => '*', // доступ ко всем методам контроллера есть у всех систем
],
Для валидации входных параметров внутри контроллера можно использовать готовый trait: Tochka\JsonRpc\Traits\JsonRpcController
Подключив данный trait в своем контроллере вы сможете проверить данные с помощью средств валидации Laravel:
public function store($title, $body)
{
$validatedData = $this->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// The blog post is valid...
}
Кроме того, в указанном trait доступны следующие методы:
/**
* Возвращает массив с переданными в запросе параметрами
*/
protected function getArrayRequest(): array;
/**
* Возвращает экземпляр класса с текущим запросом
*/
protected function getRequest(): JsonRpcRequest;
/**
* Валидация переданных в контроллер параметров
*
* @param array $rules Правила валидации
* @param array $messages Сообщения об ошибках
* @param bool $noException Если true - Exception генерироваться не будет
*
* @return bool|MessageBag Прошла валидация или нет
*/
protected function validate($rules, array $messages = [], $noException = false);
/**
* Валидирует и фильтрует переданные в контроллер параметры. Возвращает отфильтрованный массив с параметрами
*
* @param array $rules Правила валидации
* @param array $messages Сообщения об ошибках
* @param bool $noException Если true - Exception генерироваться не будет
*/
protected function validateAndFilter($rules, array $messages = [], $noException = false): array;
Вы можете указать любой канал логов, который зарегистрирован у вас в системе (либо предварительно создать его)
с помощью параметра jsonrpc.log.channel
:
/**
* Канал лога, в который будут записываться все логи
*/
'channel' => 'default',
Для того, чтобы убрать конфиденциальную информацию (логины, пароли, токены и пр.) из логов системы нужно в
указать,что именно скрывать, в конфигурации jsonrpc.log.hideParams
:
[
'App\\Http\\TestController1@method' => ['password', 'data.phone_number'],
'App\\Http\\TestController2' => '*',
]
В указанном примере из логов метода method
контроллера App\Http\TestController1
будут скрываться занчения параметров
password
и data.phone_number
(поддерживается вложенность параметров в запросе при помощи разделителя .
).
В контроллере App\Http\TestController2
во всех методах будут скрываться значения абсолютно всех параметров.
Клиент послает валидный JsonRpc2.0-запрос:
{
"jsonrpc": "2.0",
"method": "client_getInfoById",
"params": {
"clientCode": "100500",
"fromAgent" : true
},
"id": 15
}
JsonRpc сервер пытается найти указанный метод client_getInfoById
.
Имя метода разбивается на части: имяКонтроллера_имяМетода
.
Класс контроллера ищется по указанному пространству имен (параметр jsonrpc.controllerNamespace
) с указанным суффиксом (по умолчанию Controller
).
Для нашего примера сервер попытается подключить класс 'App\Http\Controller\ClientController'.
Если контроллер не существует - клиенту вернется ошибка Method not found
.
В найденном контроллере вызывается метод getInfoById
.
Далее возможно два варианта.
Если подключен обработчик AssociateParamsMiddleware
, то все переданные параметры будут переданы в метод по именам.
То есть в контроллере должен быть метод getInfoById($clientCode, $fromAgent)
.
Все параметры будут отвалидированы по типам (если типы указаны). Кроме того, таким способом можно указывать необязательные
параметры в методе - в таком случае их необязательно передавать в запросе, вместо непереданных параметров будут
использованы значения по умолчанию из метода.
Если же не будет передан один из обязательных параметров - клиенту вернется ошибка.
Если обработчик AssociateParamsMiddleware
не подключен - то все параметры из запроса будут переданы в метод по порядку.
В таком случае указанному запросу аналогичен следующий:
{
"jsonrpc": "2.0",
"method": "client_getInfoById",
"params": ["100500", true],
"id": 15
}
Если настроено получение имени контроллера из точки входа то логика следующая: Клиент посылает валидный JsonRpc2.0-запрос:
{
"jsonrpc": "2.0",
"method": "getInfoById",
"params": {
"clientCode": "100500",
"fromAgent" : true
},
"id": 15
}
На адрес \client
.
JsonRpc сервер пытается найти указанный метод getInfoById
.
В контроллере: Сlient
. Если запрос идет на адрес \client\action
то имя контроллера будет иметь вид СlientAction
.
Класс контроллера ищется по указанному пространству имен (параметр jsonrpc.controllerNamespace
) с указанным суффиксом (по умолчанию Controller
).
Для нашего примера сервер попытается подключить класс 'App\Http\Controller\ClientController' или 'App\Http\Controller\ClientActionController' соответственно.
Если контроллер не существует - клиенту вернется ошибка Method not found
.
В найденном контроллере вызывается метод getInfoById
.
По спецификации JsonRpc разрешено вызывать несколько методов в одном запросе. Для этого необходимо валидные JsonRpc2.0-вызовы передать в виде массива. Каждый вызываемый метод будет вызван из соответствующего контроллера, а вернувшиеся результаты будут возвращены клиенту в том порядке, в котором пришли запросы.
В ответе клиенту всегда присутствует параметр id, если таковой был передан клиентом. Данный параметр также позволяет идентифицировать ответы на свои запросы на стороне клиента.
Если на настроенную точку входу сделать запрос с параметром ?smd
, то сервер проигнорирует запрос и вернет полную
SMD-схему для указанной точки входа. SMD-схема строится автоматически на основании настроек указанной точки входа.
Список методов формируется исходя из доступных контроллеров в указанном для точки входа пространстве имен.
В SMD-схеме кроме стандартных описаний присутствуют дополнительные параметры, которые позволяют более точно сгенерировать
JsonRpc-клиента и документацию по серверу.
SMD-схема генерируется на основе доступных публичных методов в доступных в указанном пространстве имен контроллеров.
По умолчанию этой информации достаточно для генерации на основе схемы прокси-клиента. Но для генерации понятной и полной
документации также можно использовать расширенное описание контроллеров и методов в блоках PhpDoc
.
По умолчанию в качестве названия группы методов используется описание класса из PhpDoc:
<?php
/**
* Методы для работы с чем-то
*/
class SomeController {
// ...
}
Также название можно указать с помощью тега @apiGroupName
. В таком случае само описание класса будет проигнорировано:
<?php
/**
* Class SomeController
* @package App\Http\Controllers\Api
*
* @apiGroupName
* Методы для работы с чем-то
*/
class SomeController {
// ...
}
По умолчанию генератор SMD-схемы собирает все доступные публичные методы из контроллера. Если необходимо скрыть из
схемы какие-либо методы, можно воспользоваться тегом @apiIgnoreMethod
:
/**
* Class DossierController
* @package App\Http\Controllers\Api
*
* @apiGroupName
* Методы для работы с чем-то
* @apiIgnoreMethod someMethod
* @apiIgnoreMethod otherMethod
*/
class SomeController {
/**
* Основное описание метода.
* @apiName Название метода. Если не указан этот тег - название метода формируется автоматически по правилам
* @apiDescription
* Описание метода. Если не указан - то берется основное описание метода.
* @apiNote Замечание к методу
* @apiWarning Предупреждение к методу
* @apiParam * date="d.m.Y" $param="01.01.1970" ("23.12.2018") Описание параметра
* @apiReturn int $someData Описание возвращаемого значения
*
* @param string $param1 Описание параметра 1
* @param int $param2 Описание параметра 2
* @param string $param3 Описание параметра 3
* @return bool Описание возвращаемого ответа
*
* @apiRequestExample
* Пример запроса
* @apiResponseExample
* Пример ответа
*/