View Source 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

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

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

Quick start

Please see this guide for usage with phoenix.

documentation

Documentation

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

The package creation was inspired by some other repos:

license

License

MIT. Please see the license file for more information.