Skip to content
📫 Ergonomic primitives for working with JSON in RESTful Go servers and clients
Go
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
base
.gitignore
LICENSE
README.md
azure-pipelines.yml
error.go
go.mod
go.sum
message.go
res.go
res_test.go

README.md

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.

GoDoc CI Status Go Report Card Sourcegraph for Repo Reference Count

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",
  }
}
You can’t perform that action at this time.