JSON-RPC 2.0 Server Implementation with SMD support written in Go (go generate)
zenrpc
is a JSON-RPC 2.0 server library with Service Mapping Description support.
It's built on top of go generate
instead of reflection.
Service is struct with RPC methods, service represents RPC namespace.
go get github.com/semrush/zenrpc/v2/zenrpc
github.com/semrush/zenrpc/v2
into our code with rpc service.//zenrpc
to your service or embed zenrpc.Service
into your service struct.go generate
or zenrpc
for magicfunc(Service) Method([args]) (<value>, <error>)
func(Service) Method([args]) <value>
func(Service) Method([args]) <error>
func(Service) Method([args])
package main
import (
"flag"
"context"
"errors"
"math"
"log"
"net/http"
"os"
"github.com/semrush/zenrpc/v2"
"github.com/semrush/zenrpc/v2/testdata"
)
type ArithService struct{ zenrpc.Service }
// Sum sums two digits and returns error with error code as result and IP from context.
func (as ArithService) Sum(ctx context.Context, a, b int) (bool, *zenrpc.Error) {
r, _ := zenrpc.RequestFromContext(ctx)
return true, zenrpc.NewStringError(a+b, r.Host)
}
// Multiply multiples two digits and returns result.
func (as ArithService) Multiply(a, b int) int {
return a * b
}
type Quotient struct {
Quo, Rem int
}
func (as ArithService) Divide(a, b int) (quo *Quotient, err error) {
if b == 0 {
return nil, errors.New("divide by zero")
} else if b == 1 {
return nil, zenrpc.NewError(401, errors.New("we do not serve 1"))
}
return &Quotient{
Quo: a / b,
Rem: a % b,
}, nil
}
// Pow returns x**y, the base-x exponential of y. If Exp is not set then default value is 2.
//zenrpc:exp=2
func (as ArithService) Pow(base float64, exp float64) float64 {
return math.Pow(base, exp)
}
//go:generate zenrpc
func main() {
addr := flag.String("addr", "localhost:9999", "listen address")
flag.Parse()
rpc := zenrpc.NewServer(zenrpc.Options{ExposeSMD: true})
rpc.Register("arith", testdata.ArithService{})
rpc.Register("", testdata.ArithService{}) // public
rpc.Use(zenrpc.Logger(log.New(os.Stderr, "", log.LstdFlags)))
http.Handle("/", rpc)
log.Printf("starting arithsrv on %s", *addr)
log.Fatal(http.ListenAndServe(*addr, nil))
}
All comments are optional.
Method comments
//zenrpc:<method parameter>[=<default value>][whitespaces<description>]
//zenrpc:<error code>[whitespaces<description>]
//zenrpc:return[whitespaces<description>]
Struct comments
type MyService struct {} //zenrpc
We recommend to use SMDBox. It is Swagger-like JSON RPC API browser, compatible with smd scheme, generated by zenrpc.