alex-kudrya/laravel-jsonrpc

Laravel 的 JSON RPC 2.0

v1.2 2024-02-20 10:55 UTC

This package is auto-updated.

Last update: 2024-09-20 13:54:47 UTC


README

Total Downloads Version License PHP Version Require

关于 JSON-RPC 你可以在这里了解 - #JSONRPC

安装

composer require alex-kudrya/laravel-jsonrpc

app.phpproviders 数组中添加 \AlexKudrya\Adminix\Providers\AdminixServiceProvider::class

// config/app.php

'providers' => [ 
    ... 
    \AlexKudrya\LaravelJsonRpc\Providers\JsonRpcServiceProvider::class,
    ...
 ]

将包发布到你的应用

php artisan vendor:publish --provider=AlexKudrya\LaravelJsonRpc\Providers\JsonRpcServiceProvider

工作原理

JSON-RPC API 是一个具有单个端点的 API,默认情况下是 https://your-domain.com/json-rpc/v1json-rpc/v1 部分可以在 config/json_rpc.php 中进行配置。

请求始终只使用 POST 方法。

此协议存在固定的请求-响应结构。

示例

请求

{
    "jsonrpc": "2.0",
    "method": "ControllerName@MethodName",
    "params": {
        "parameter": "value"
    },
    "id": "some_unique_request_id"
}

响应

{
    "jsonrpc": "2.0",
    "result": {
        "key": "value"
    },
    "id": "some_unique_request_id"
}

jsonrpcmethodparamsid 是 JSON-RPC 请求的必填字段

字段描述
jsonrpc始终等于 2.0,这是一个常数,无需考虑。
method我们调用的方法。
params包含输入数据的 JSON,可以是空的,但必须存在。
id一个唯一的请求 ID,用于前端。当您使用批量请求时,您的前端需要识别哪个响应对应哪个请求。

调用方法 由以下部分组成

  • 控制器名称
  • 分隔符
  • 方法名称

示例:User@get 在此示例中

  • "User" 是控制器名称,表示 App\Http\Controllers\JsonRpc\UserController 控制器/类。 App\Http\Controllers\JsonRpc 是从 config/json_rpc.php 文件中的 controllers_root_namespace,而 Controller 是从 config/json_rpc.php 文件中的 controllers_postfix
  • "@" 是分隔符,来自 config/json_rpc.php 文件的 controllers_method_delimiter
  • "get" 表示我们调用该控制器中的 get() 方法。

因此,method User@get 调用 App\Http\Controllers\JsonRpc\UserController 中的 get() 方法

检查服务器

要检查服务器状态,您需要发出此请求

{
    "jsonrpc": "2.0",
    "method": "ping",
    "params": {},
    "id": "dlalkmd1231da"
}

如果一切正常,您将收到此响应

{
    "jsonrpc": "2.0",
    "result": {
        "message": "pong"
    },
    "id": "dlalkmd1231da"
}

基本用法

请求

{
    "jsonrpc": "2.0",
    "method": "Product@create",
    "params": {
        "name": "pencil",
        "price": "1.5"
    },
    "id": "lsfkkj3fl3k92202jf2n32k430f"
}

控制器

// app/Http/Controllers/JsonRpc/ProductController.php

namespace App\Http\Controllers\JsonRpc;

use AlexKudrya\LaravelJsonRpc\Requests\JsonRpcRequest;
use App\Http\Controllers\Controller;

class ProductController extends Controller
{
    public function create(JsonRpcRequest $request)
    {
        $request->params(); // ['name' => 'pencil', 'price' => '1.5']
        $request->params('name'); // pencil
        $request->param('price'); // 1.5

        $request->id(); // lsfkkj3fl3k92202jf2n32k430f
        $request->method() // Product@create
        $request->method(true) // ["controller" => "Product", "method" => "create"]

        // you can use your input params like this:

        $product = Product::create([
            'name' => $request->params('name'),
            'price' => $request->params('price'),
        ])

        // or like this:

        $product = Product::create($request->params())

        return $product;
    }
}

响应

{
    "jsonrpc": "2.0",
    "result": {
        "id": "1",
        "name": "pencil",
        "price": "1.5"
    },
    "id": "lsfkkj3fl3k92202jf2n32k430f"
}

注意

  • 要使用请求验证,您的 Request 类必须扩展 AlexKudrya\LaravelJsonRpc\Requests\JsonRpcRequest 类。
  • 请不要使用 $request->all()$request->input() 来获取您的输入参数,您需要使用 $request->params()$request->param({key}) 来实现此目的

批量请求

如果您不需要并行执行多个请求,您可以使用批量请求。此类请求的特点是请求按照在请求中出现的顺序依次执行。请注意,一个请求的失败不会阻止后续请求的执行。

您可以使用批量请求在一次请求中发送多个请求。

请求

[
    {
        "jsonrpc": "2.0",
        "method": "Product@create",
        "params": {
            "name": "pencil",
            "price": "1.5"
        },
        "id": "lsfkkj3fl3k92202jf2n32k430f"
    },
    {
        "jsonrpc": "2.0",
        "method": "Product@create",
        "params": {
            "name": "pen",
            "price": "3.2"
        },
        "id": "dqsfkfOd2dwkdwo1231dlslawm20"
    }
]

响应

[
    {
        "jsonrpc": "2.0",
        "result": {
            "id": "1",
            "name": "pencil",
            "price": "1.5"
        },
        "id": "lsfkkj3fl3k92202jf2n32k430f"
    },
    {
        "jsonrpc": "2.0",
        "result": {
            "id": "2",
            "name": "pen",
            "price": "3.2"
        },
        "id": "dqsfkfOd2dwkdwo1231dlslawm20"
    }
]