alex-kudrya / laravel-jsonrpc
Laravel 的 JSON RPC 2.0
v1.2
2024-02-20 10:55 UTC
Requires
- php: >= 8.2
- illuminate/contracts: >= 10
- illuminate/http: >= 10
- illuminate/support: >= 10
- illuminate/validation: >= 10
- laravel/framework: >= 10
README
关于 JSON-RPC 你可以在这里了解 - #JSONRPC
安装
composer require alex-kudrya/laravel-jsonrpc
在 app.php
的 providers
数组中添加 \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/v1
,json-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"
}
jsonrpc
,method
,params
,id
是 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"
}
]