PhxJsonRpc

ci.yml

Simple implementation of JSON-RPC server, written in elixir and working with phoenix.

Allows you to define any number of rpc endpoints, which can be accessed via http protocol.

How it works

The package uses router macro for matching RPC calls to your end-user service.

It uses JSON SCHEMA as a specification for your services and provides parsing, validation and error handling briefly.

Requests can be served in batches with asyncronous order.

To start handling requests with phoenix:

  1. Define rpc router
defmodule MyApp.Rpc.Router do
  use PhxJsonRpc.Router,
    otp_app: :rpc_router,
    schema: "[PATH_TO_YOUR_SCHEMA]",
    version: "2.0",
    max_batch_size: 20

  alias MyApp.Service

  ## Service routes
  rpc("hello", Service, :hello, "#/components/schemas/Greeting")
end
  1. Use handler in any web controller
defmodule MyAppWeb.RpcController do
  use MyAppWeb, :controller

  alias MyApp.Rpc.Router

  def rpc(conn, request) do
    response = Router.handle(request)
    render(conn, "response.json", response)
  end
end
  1. Import helpers inside your view
defmodule MyAppWeb.RpcView do
  use MyAppWeb, :view

  import PhxJsonRpc.Views.Helpers

  def render("response.json", %{response: response}) do
      render_json(response)
  end
end
  1. Ensure your service module is defined and it's methods described in json-schema
defmodule MyApp.Service do
  @moduledoc "My service"

  def hello(%{"name" => name}) do
    "Hello, #{name}"
  end
end

See quick start and documentation section for more detail.

Request and response using postman:

request

response

Installation

The package can be installed by adding phx_json_rpc to your list of dependencies in mix.exs:

def deps do
  [
    {:phx_json_rpc, "~> 0.3.5"}
  ]
end

This package depends on ex_json_schema for validation purposes.

Quick start

Please see this guide for usage with phoenix.

Documentation

The docs can be found at https://hexdocs.pm/phx_json_rpc.

Links

The package creation was inspired by some other repos:

License

MIT. Please see the license file for more information.