JSON RPC
The :std/net/json-rpc
library provides support for
JSON RPC 2.0
both as a client issuing requests
over HTTP
and as a server processing them.
Note that you should probably be using POST requests (the default) and not GET requests (that we support but not all servers do and are not recommended).
Also note that make a practical effort to support existing clients and servers, most of which don't follow various parts of the many specifications, and so we are not too strict in our checking.
To use bindings from this module
(import :std/net/json-rpc)
json-rpc
(json-rpc server-url method (params (void))
auth: (auth #f)
headers: (headers #f)
cookies: (cookies #f)
ssl-context: (ssl-context (default-client-ssl-context))
result-decoder: (result-decoder identity)
param-encoder: (param-encoder identity)
log: (log #f)
http-method: (http-method 'POST)) -> json-rpc response
Issue a client request to a JSON RPC server at server-url
,
calling the JSON-RPC method
(a string),
optionally with the given params
as parameters.
When transformed by param-encoder
, the parameters must be transformable by
json-object->string
into a valid JSON array or object or null.
The given http-method
is used (POST
is recommended,
though GET
is supported for debugging purposes mainly),
and the auth
, headers
, cookies
and ssl-context
are passed to the
HTTP client interface.
The provided log
function is called, if any, with some JSON information about the request.
The JSON returned by the server is transformed by result-decoder
.
A variety of HTTP or JSON-RPC errors can be raised during the query that you may or may not want to report, log or inspect, but otherwise this is the only function you need to call as a JSON RPC client.
As for headers, you should follow the documentation and examples for the services you're using, and lacking that may try some as follows:
headers: '(("Content-Type" . "application/json-rpc")
("Accept" . "application/json-rpc, application/json, application/jsonrequest"))
json-rpc-handler
(json-rpc-handler processor log: (log #f))
Given a processor
function that takes two arguments, the method
and the params
of a request,
and either returns a JSON result for the request response or raises an error,
json-rpc-handler
will return an HTTP request handler suitable to be registered with:
(import :std/net/httpd :std/net/json-rpc)
(http-register-handler httpd "/my-json-rpc-endpoint" (json-rpc-handler processor))
The optional log
function if provided will be called with some JSON object that
document the request and its response.
A variety of HTTP or JSON-RPC errors can be raised during the processing, that you may or may not want to handle, log or inspect, but otherwise this is the only function you need to use as a JSON RPC server.
serve-json-rpc
(serve-json-rpc processor request-json) -> response-json
In case you are implementing a JSON RPC server over a transport layer other than HTTP,
you can use serve-json-rpc
to handle the JSON RPC processing and call it in your server.
decode-json-rpc-response
(decode-json-rpc-response decoder request-id response-json) -> result or error
In case you are implementing a JSON RPC client over a transport layer other than HTTP,
you can use decode-json-rpc
to handle the response from the server.
json-rpc-version
A string, "2.0"
, representing the version of JSON RPC that we support as client and server.
json-rpc-request json-rpc-request? json-rpc-response json-rpc-response?
The classes json-rpc-request
and json-rpc-response
are used internally for JSON RPC processing,
in case you are working with the transport layer.
Error handling
json-rpc-error json-rpc-error?
json-rpc-error-code json-rpc-error-message json-rpc-error-data
parser-error invalid-request method-not-found invalid-params
internal-error application-error system-error transport-error
JSON-RPCError JSON-RPCError? json-rpc-error?
MalformedRequest MalformedRequest? malformed-request?
MalformedResponse MalformedResponse? malformed-response?
A variety of classes and functions are offered to you to handle errors if you so desire, that correspond to the various failure modes of using the JSON RPC protocol.