bpartner/jsonrpc

JSON RPC 服务器

3.1 2024-01-12 14:35 UTC

This package is auto-updated.

Last update: 2024-09-12 16:04:19 UTC


README

Latest Version on Packagist Total Downloads

这是一个简单的 JSON-RPC 2.0 服务器,适用于 Laravel,不包含批处理请求。

安装

您可以通过 composer 安装此包

composer require bpartner/jsonrpc

php artisan vendor:publish --tag=config

配置

config/jsonrpc.php 中设置命名空间和 Bearer 令牌(默认 1234567890)

如果 Bearer 令牌无效,请将以下规则添加到您的 .htaccess 文件中

RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

基本用法

php artisan make:rpc MyHandler 

在创建处理程序后,在 handle 方法中放入您的业务逻辑,并返回包含响应数据的数组。

public function handle(): array
{
    $myData = MyBusinessLogicClass::make($this->params);

    return ['data' => $myData];
}

以 Bearer Token 的形式,发送 POST 请求到 /jsonrpc/v1/endpoint,符合 Json RPC 2.0 标准。

{
    "jsonrpc": "2.0",
    "method": "myHandler",
    "params": {
        "param1": "param1",
        "param2": {
            "param3": 123,
        }
    },
    "id": "abracadabra"
}

使用处理程序中的 rule 方法来验证输入参数。

protected function rule(): array
{
    return [
        'param1' => 'require|string',
        'param2.param3' => 'require|numeric'
    ];
}

高级用法

您可以使用任何路由、中间件和守卫来为您的 RPC 端点。

  1. config/jsonrpc.php 中禁用默认路由
  2. 创建您的自定义路由
  3. 创建您的中间件
  4. 创建您的控制器并使用 RpcService

中间件示例

class AuthToken
{
    public function handle(Request $request, Closure $next)
    {
        if ($request->header('x-auth-token') !== config('jsonrpc.token')) {
            return  response()->json([
                'status' => 'error',
                'code' => 401,
                'message' => 'Unauthorized',
            ]);
        }
        return $next($request);
    }
}

控制器示例

namespace App\Http\Controllers


use Bpartner\Jsonrpc\RpcFormRequest;
use Bpartner\Jsonrpc\RpcRequest;
use Bpartner\Jsonrpc\RpcServiceInterface; 
use Illuminate\Routing\Controller;

class MyContoller extends Controller
{
    public function __invoke(RpcFormRequest $request, RpcServiceInterface $rpcService)
    {
        return $rpcService->run();
    }
}

中间件

为任何 RpcHandler 创建自己的中间件

 protected string|array $middlewares = 'guest';
//or
 protected string|array $middlewares = [
    MyMiddleware::class,
    SecondMiddleware::class
];

重要

此包不支持批处理请求。例如,此请求不受支持

[
    {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
    {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
    {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},
    {"foo": "boo"},
    {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},
    {"jsonrpc": "2.0", "method": "get_data", "id": "9"} 
]

致谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件