RPC-like API for your Laravel project

tabuna profile image Alexandr Chernyaev ・2 min read

JSON-RPC 2.0 this is a simple stateless protocol for creating an RPC (Remote Procedure Call) style API. It usually looks as follows:

You have one single endpoint on the server that accepts requests with a body of the form:

{"jsonrpc": "2.0", "method": "post.like", "params": {"post": "12345"}, "id": 1}

And it returns answers of the view:

{"jsonrpc": "2.0", "result": {"likes": 123}, "id": 1}

If an error occurs - the error response:

{"jsonrpc": "2.0", "error": {"code": 404, "message": "Post not found"}, "id": "1"}

And it's all! Did I say that is easy?

Bonus support batch operations:




  {"jsonrpc":"2.0","error":{"code":404,"message":"Server not found"},"id": 2}

In the id field, the API client can send anything so that after receiving responses from the server, match them with requests.

Also, the client can send “notifications” - requests without an “id” field that do not require a response from the server:

{"jsonrpc":"2.0","method":"analytics:trackView","params":{"type": "post", "id":"123"}}

Not so long ago I became acquainted with this protocol, but it is great for my tasks of creating an API on Laravel. To use such a protocol in your application, you need to set the dependency using the composer:

$ composer require sajya/server

All actions are described in Procedure classes, it is a familiar controller, but it must contain the static property name.

Create the following artisan class:

php artisan make:procedure TennisProcedure

A new file will be created in the app/Http/Procedures/TennisProcedure.php

Let's call the new procedure tennis, to do this, change the name property and add the pong returning value to the ping method to get this content:

namespace App\Http\Procedures;

use Sajya\Server\Procedure;

class TennisProcedure extends Procedure
     * The name of the procedure that will be
     * displayed and taken into account in the search
    public static string $name = 'tennis';

     * Execute the procedure.
     * @return string
    public function ping(): string
        return 'pong';

Like the controller, the procedure needs to be registered in the routes file, define it in the file api.php:

use App\Http\Procedures\TennisProcedure;

Route::rpc('/v1/endpoint', [

In order to turn to the required method, you must pass the name specified in the class and the necessary method with the delimiter "@" character. In our case, it will be: tennis@ping.

Let's make a curl call to the new API:

curl '' --data-binary '{"jsonrpc":"2.0","method":"tennis@ping","params":[],"id" : 1}'

The result will be the resulting JSON string:



markdown guide