Godoc: https://pkg.go.dev/github.com/pbedat/expose
exposeRPC allows you to create RPC interfaces, without the usual boilerplate. Methods can be exposed directly in Go code, without any further generation or definition steps. The resulting http interface provides an OpenAPI specification, that can be used to create type safe clients, to call the functions you exposed.
Expose the functions Inc and Get as RPC endpoints:
package main
import (
"context"
"log"
"net/http"
"sync/atomic"
"github.com/pbedat/expose"
)
var i = &atomic.Int32{}
func Inc(_ context.Context, delta int) (int, error) {
return int(i.Add(int32(delta))), nil
}
func Get(context.Context, expose.Void) (int, error) {
return int(i.Load()), nil
}
func main() {
h, err := expose.NewHandler(
[]expose.Function{
expose.Func("/counter/inc", Inc),
expose.Func("/counter/get", Get),
},
)
if err != nil {
panic(err)
}
http.Handle("/", h)
http.ListenAndServe(":8000", nil)
}Perform the RPC calls:
curl -H "content-type: application/json" --data 1 localhost:8000/rpc/counter/inc
curl -X POST localhost:8000/rpc/counter/get
> 1Get the OpenAPI Spec:
curl localhost:8000/rpc/swagger.json{
"components": {
"schemas": {
"int": {
"type": "integer"
}
}
},
"info": {
"title": "Starter Example",
"version": ""
},
"openapi": "3.0.2",
"paths": {
"/counter/get": {
"post": {
"operationId": "counter#get",
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/int"
}
}
}
},
"default": {
"description": ""
}
},
"tags": ["counter"]
}
},
"/counter/inc": {
"post": {
"operationId": "counter#inc",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/int"
}
}
}
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/int"
}
}
}
},
"default": {
"description": ""
}
},
"tags": ["counter"]
}
}
},
"servers": [
{
"url": "http://localhost:8000/rpc"
}
]
}More examples: https://github.com/pbedat/expose/tree/main/examples