Stack is a framework in Go to build JSON APIs faster.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

stack GoDoc Build Status

stack is a framework to build JSON-APIs faster. It is based on the series of articles "Build Your Own Web Framework in Go" I began to write a few weeks ago.

The public API of the package is stable and you can use it right now to make your application. I don't indend to break any existing feature but will add new features to make the framework more useful for production. Look at the documentation.

Checkout the "Unstable Features" section below to read about upcoming/work-in-progress features.

Getting started

package main

import (

type Tea struct {
  Name string `json:"name"`

type TeaCollection struct {
  Data []Tea `json:"data"`  

type TeaResource struct {
  Data Tea `json:"data"`  

func teasHandler(w http.ResponseWriter, r *http.Request) {
  res := getTeas() // Returns a *TeaCollection
  jsonapi.Write(w, res)  

func teaHandler(w http.ResponseWriter, r *http.Request) {
  res := getTea(mux.Params(r).ByName("id")) // Returns a *TeaResource
  jsonapi.Write(w, res)  

func createTeaHandler(w http.ResponseWriter, r *http.Request) {
  res := createTea(jsonapi.Body(r).(*TeaResource))
  jsonapi.Write(w, res)

func main() {
  m := jsonapi.New()
  m.Post("/teas").Use(jsonapi.ContentTypeHandler, jsonapi.BodyHandler(TeaResource{})).ThenFunc(createTeaHandler)

Unstable Features

schema package

You can find this package on the schema branch. It aims at validating URL params and JSON request bodies. It also generates a JSON schema from the schema definition which can serve as a documentation, or to auto-build client libraries.

data package

You can find this package on the data branch. It aims at providing interfaces to connect the data layer of an application to the router. This way you can just write your models following these interfaces and the router will take care of the rest. No http.Handler to write. As you see in the current "Getting Started" section, you need to manually make a handler to call your data layer then write the response. This code is always the same and will not be necessary once this package becomes stable.