jsonapi/examples/app.go

136 lines
3.7 KiB
Go

package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/http/httptest"
"time"
"github.com/google/jsonapi"
)
func main() {
jsonapi.Instrumentation = func(r *jsonapi.Runtime, eventType jsonapi.Event, callGUID string, dur time.Duration) {
metricPrefix := r.Value("instrument").(string)
if eventType == jsonapi.UnmarshalStart {
fmt.Printf("%s: id, %s, started at %v\n", metricPrefix+".jsonapi_unmarshal_time", callGUID, time.Now())
}
if eventType == jsonapi.UnmarshalStop {
fmt.Printf("%s: id, %s, stopped at, %v , and took %v to unmarshal payload\n", metricPrefix+".jsonapi_unmarshal_time", callGUID, time.Now(), dur)
}
if eventType == jsonapi.MarshalStart {
fmt.Printf("%s: id, %s, started at %v\n", metricPrefix+".jsonapi_marshal_time", callGUID, time.Now())
}
if eventType == jsonapi.MarshalStop {
fmt.Printf("%s: id, %s, stopped at, %v , and took %v to marshal payload\n", metricPrefix+".jsonapi_marshal_time", callGUID, time.Now(), dur)
}
}
exampleHandler := &ExampleHandler{}
http.HandleFunc("/blogs", exampleHandler.ServeHTTP)
exerciseHandler()
}
func exerciseHandler() {
// list
req, _ := http.NewRequest(http.MethodGet, "/blogs", nil)
req.Header.Set(headerAccept, jsonapi.MediaType)
w := httptest.NewRecorder()
fmt.Println("============ start list ===========")
http.DefaultServeMux.ServeHTTP(w, req)
fmt.Println("============ stop list ===========")
jsonReply, _ := ioutil.ReadAll(w.Body)
fmt.Println("============ jsonapi response from list ===========")
fmt.Println(string(jsonReply))
fmt.Println("============== end raw jsonapi from list =============")
// show
req, _ = http.NewRequest(http.MethodGet, "/blogs?id=1", nil)
req.Header.Set(headerAccept, jsonapi.MediaType)
w = httptest.NewRecorder()
fmt.Println("============ start show ===========")
http.DefaultServeMux.ServeHTTP(w, req)
fmt.Println("============ stop show ===========")
jsonReply, _ = ioutil.ReadAll(w.Body)
fmt.Println("============ jsonapi response from show ===========")
fmt.Println(string(jsonReply))
fmt.Println("============== end raw jsonapi from show =============")
// create
blog := fixtureBlogCreate(1)
in := bytes.NewBuffer(nil)
jsonapi.MarshalOnePayloadEmbedded(in, blog)
req, _ = http.NewRequest(http.MethodPost, "/blogs", in)
req.Header.Set(headerAccept, jsonapi.MediaType)
w = httptest.NewRecorder()
fmt.Println("============ start create ===========")
http.DefaultServeMux.ServeHTTP(w, req)
fmt.Println("============ stop create ===========")
buf := bytes.NewBuffer(nil)
io.Copy(buf, w.Body)
fmt.Println("============ jsonapi response from create ===========")
fmt.Println(buf.String())
fmt.Println("============== end raw jsonapi response =============")
// echo
blogs := []interface{}{
fixtureBlogCreate(1),
fixtureBlogCreate(2),
fixtureBlogCreate(3),
}
in = bytes.NewBuffer(nil)
jsonapi.MarshalPayload(in, blogs)
req, _ = http.NewRequest(http.MethodPut, "/blogs", in)
req.Header.Set(headerAccept, jsonapi.MediaType)
w = httptest.NewRecorder()
fmt.Println("============ start echo ===========")
http.DefaultServeMux.ServeHTTP(w, req)
fmt.Println("============ stop echo ===========")
buf = bytes.NewBuffer(nil)
io.Copy(buf, w.Body)
fmt.Println("============ jsonapi response from create ===========")
fmt.Println(buf.String())
fmt.Println("============== end raw jsonapi response =============")
responseBlog := new(Blog)
jsonapi.UnmarshalPayload(buf, responseBlog)
out := bytes.NewBuffer(nil)
json.NewEncoder(out).Encode(responseBlog)
fmt.Println("================ Viola! Converted back our Blog struct =================")
fmt.Println(string(out.Bytes()))
fmt.Println("================ end marshal materialized Blog struct =================")
}