Package res provides handy primitives for working with JSON in Go HTTP servers
and clients via go-chi/render. It is
designed to be lightweight and easy to extend.
I originally wrote something similar to this in two UBC Launch Pad projects that I worked on - Inertia and Pinpoint - and felt like it might be useful to have it as a standalone package.
It is currently a work-in-progress - I'm hoping to continue refining the API and add more robust tests.
Usage
go get -u go.bobheadxi.dev/res
Clientside
I implemented something similar to res in Inertia.
It has a client that shows how you might leverage this library:
inertia/client.Client
import "go.bobheadxi.dev/res" func main() { resp, err := http.Get(os.Getenv("URL")) if err != nil { log.Fatal(err) } var info string b, err := res.Unmarshal(resp.Body, res.KV{Key: "info", Value: &info}) if err != nil { log.Fatal(err) } if err := b.Error(); err != nil { log.Fatal(err) } println(info) }
Serverside
OK
import "go.bobheadxi.dev/res" func Handler(w http.ResponseWriter, r *http.Request) { res.R(w, r, res.MsgOK("hello world!", "stuff", "amazing", "details", res.M{"world": "hello"})) }
Will render something like:
{ "code": 200, "message": "hello world", "request_id": "12345", "body": { "stuff": "amazing", "details": { "world": "hello", } } }
Error
import "go.bobheadxi.dev/res" func Handler(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { res.R(w, r, res.ErrBadRequest("failed to read request", "error", err, "details", "something")) return } }
Will render something like:
{ "code": 400, "message": "failed to read request", "request_id": "12345", "error": "could not read body", "body": { "details": "something", } }