jrpc - rpc with json
jrpc library provides client and server for RPC-like communication over HTTP with json encoded messages. The protocol is a somewhat simplified version of json-rpc with a single POST call sending Request json (method name and the list of parameters) moreover, receiving json Response with result data and an error string.
Usage
Plugin (server)
// Server wraps jrpc.Server and adds synced map to store data
type Puglin struct {
*jrpc.Server
}
// create plugin (jrpc server)
plugin := jrpcServer{
Server: &jrpc.Server{
API: "/command", // base url for rpc calls
AuthUser: "user", // basic auth user name
AuthPasswd: "password", // basic auth password
AppName: "jrpc-example", // plugin name for headers
Logger: logger,
},
}
plugin.Add("mycommand", func(id uint64, params json.RawMessage) Response {
return jrpc.EncodeResponse(id, "hello, it works", nil)
})
Application (client)
// Client makes jrpc.Client and invoke remote call
rpcClient := jrpc.Client{
API: "http://127.0.0.1:8080/command",
Client: http.Client{},
AuthUser: "user",
AuthPasswd: "password",
}
resp, err := rpcClient.Call("mycommand")
var message string
if err = json.Unmarshal(*resp.Result, &message); err != nil {
panic(err)
}
for functional examples for both plugin and application see _example
Technical details
jrpc.Server
runs on user-defined port as a regular http server- Server accepts a single POST request on user-defined url with Request sent as json payload
request details and an example:
```go
type Request struct {
Method string `json:"method"`
Params interface{} `json:"params,omitempty"`
ID uint64 `json:"id"`
}
```
example:
```json
{
"method":"test",
"params":[123,"abc"],
"id":1
}
```
- Params can be a struct, primitive type or slice of values, even with different types.
- Server defines
ServerFn
handler function to react on a POST request. The handler provided by the user. - Communication between the server and the caller can be protected with basic auth.
- Client provides a single method
Call
and returnResponse
response details:
// Response encloses result and error received from remote server
type Response struct {
Result *json.RawMessage `json:"result,omitempty"`
Error string `json:"error,omitempty"`
ID uint64 `json:"id"`
}
- User should encode and decode json payloads on the application level, see provided examples
jrpc.Server
doesn't support https internally (yet). If used on exposed or non-private networks, should be proxied with something providing https termination (nginx and others).
Status
The code was extracted from remark42 and still under development. Until v1.x released the API & protocol may change.