res
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",
}
}