A quick and easy way to setup a RESTful JSON API
A quick and easy way to setup a RESTful JSON API
A quick and easy way to setup a RESTful JSON API
Go-Json-Rest is a thin layer on top of net/http that helps building RESTful JSON APIs easily. It provides fast and scalable request routing using a Trie based implementation, helpers to deal with JSON requests and responses, and middlewares for functionalities like CORS, Auth, Gzip, Status ...
net/http Handler. This standard interface allows combinations with other Handlers.This package is "go-gettable", just do:
go get github.com/ant0ine/go-json-rest/rest
The recommended way of using this library in your project is to use the "vendoring" method, where this library code is copied in your repository at a specific revision. This page is a good summary of package management in Go.
Core Middlewares:
| Name | Description |
|---|---|
| AccessLogApache | Access log inspired by Apache mod_log_config |
| AccessLogJson | Access log with records as JSON |
| AuthBasic | Basic HTTP auth |
| ContentTypeChecker | Verify the request content type |
| Cors | CORS server side implementation |
| Gzip | Compress the responses |
| If | Conditionally execute a Middleware at runtime |
| JsonIndent | Easy to read JSON |
| Jsonp | Response as JSONP |
| PoweredBy | Manage the X-Powered-By response header |
| Recorder | Record the status code and content length in the Env |
| Status | Memecached inspired stats about the requests |
| Timer | Keep track of the elapsed time in the Env |
Third Party Middlewares:
| Name | Description |
|---|---|
| Statsd | Send stats to a statsd server |
| JWT | Provides authentication via Json Web Tokens |
| AuthToken | Provides a Token Auth implementation |
| ForceSSL | Forces SSL on requests |
| SecureRedirect | Redirect clients from HTTP to HTTPS |
If you have a Go-Json-Rest compatible middleware, feel free to submit a PR to add it in this list, and in the examples.
All the following examples can be found in dedicated examples repository: https://github.com/ant0ine/go-json-rest-examples
First examples to try, as an introduction to go-json-rest.
Tradition!
curl demo:
curl -i http://127.0.0.1:8080/
code:
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
)
func main() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
api.SetApp(rest.AppSimple(func(w rest.ResponseWriter, r *rest.Request) {
w.WriteJson(map[string]string{"Body": "Hello World!"})
}))
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
}
Demonstrate how to use the relaxed placeholder (notation #paramName).
This placeholder matches everything until the first /, including .
curl demo:
curl -i http://127.0.0.1:8080/lookup/google.com
curl -i http://127.0.0.1:8080/lookup/notadomain
code:
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net"
"net/http"
)
func main() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
router, err := rest.MakeRouter(
rest.Get("/lookup/#host", func(w rest.ResponseWriter, req *rest.Request) {
ip, err := net.LookupIP(req.PathParam("host"))
if err != nil {
rest.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteJson(&ip)
}),
)
if err != nil {
log.Fatal(err)
}
api.SetApp(router)
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
}
Demonstrate simple POST GET and DELETE operations
curl demo:
curl -i -H 'Content-Type: application/json' \
-d '{"Code":"FR","Name":"France"}' http://127.0.0.1:8080/countries
curl -i -H 'Content-Type: application/json' \
-d '{"Code":"US","Name":"United States"}' http://127.0.0.1:8080/countries
curl -i http://127.0.0.1:8080/countries/FR
curl -i http://127.0.0.1:8080/countries/US
curl -i http://127.0.0.1:8080/countries
curl -i -X DELETE http://127.0.0.1:8080/countries/FR
curl -i http://127.0.0.1:8080/countries
curl -i -X DELETE http://127.0.0.1:8080/countries/US
curl -i http://127.0.0.1:8080/countries
code:
…
Demonstrate how to use Method Values.
Method Values have been introduced in Go 1.1.
This shows how to map a Route to a method of an instantiated object (i.e: receiver of the method)
curl demo:
curl -i -H 'Content-Type: application/json' \
-d '{"Name":"Antoine"}' http://127.0.0.1:8080/users
curl -i http://127.0.0.1:8080/users/0
curl -i -X PUT -H 'Content-Type: application/json' \
-d '{"Name":"Antoine Imbert"}' http://127.0.0.1:8080/users/0
curl -i -X DELETE http://127.0.0.1:8080/users/0
curl -i http://127.0.0.1:8080/users
code:
…
Common use cases, found in many applications.
Combine Go-Json-Rest with other handlers.
api.MakeHandler() is a valid http.Handler, and can be combined with other handlers.
In this example the api handler is used under the /api/ prefix, while a FileServer is instantiated under the /static/ prefix.
curl demo:
curl -i http://127.0.0.1:8080/api/message
curl -i http://127.0.0.1:8080/static/main.go
code:
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
)
func main() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
router, err := rest.MakeRouter(
rest.Get("/message", func(w rest.ResponseWriter, req *rest.Request) {
w.WriteJson(map[string]string{"Body": "Hello World!"})
}),
)
if err != nil {
log.Fatal(err)
}
api.SetApp(router)
http.Handle("/api/", http.StripPrefix("/api", api.MakeHandler()))
http.Handle("/static/", http.StripPrefix("/static", http.FileServer(http.Dir("."))))
log.Fatal(http.ListenAndServe(":8080", nil))
}
Demonstrate basic CRUD operation using a store based on MySQL and GORM
GORM is simple ORM library for Go. In this example the same struct is used both as the GORM model and as the JSON model.
curl demo:
curl -i -H 'Content-Type: application/json' \
-d '{"Message":"this is a test"}' http://127.0.0.1:8080/reminders
curl -i http://127.0.0.1:8080/reminders/1
curl -i http://127.0.0.1:8080/reminders
curl -i -X PUT -H 'Content-Type: application/json' \
-d '{"Message":"is updated"}' http://127.0.0.1:8080/reminders/1
curl -i -X DELETE http://127.0.0.1:8080/reminders/1
code:
…
Demonstrate how to setup CorsMiddleware around all the API endpoints.
curl demo:
curl -i http://127.0.0.1:8080/countries
code:
…
Demonstrate how to use the JSONP middleware.
curl demo:
curl -i http://127.0.0.1:8080/
curl -i http://127.0.0.1:8080/?cb=parseResponse
code:
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
)
func main() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
api.Use(&rest.JsonpMiddleware{
CallbackNameKey: "cb",
})
api.SetApp(rest.AppSimple(func(w rest.ResponseWriter, r *rest.Request) {
w.WriteJson(map[string]string{"Body": "Hello World!"})
}))
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
}
Demonstrate how to setup AuthBasicMiddleware as a pre-routing middleware.
curl demo:
curl -i http://127.0.0.1:8080/
curl -i -u admin:admin http://127.0.0.1:8080/
code:
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
)
func main() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
api.Use(&rest.AuthBasicMiddleware{
Realm: "test zone",
Authenticator: func(userId string, password string) bool {
if userId == "admin" && password == "admin" {
return true
}
return false
},
})
api.SetApp(rest.AppSimple(func(w rest.ResponseWriter, r *rest.Request) {
w.WriteJson(map[string]string{"Body": "Hello World!"})
}))
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
}
Demonstrate how to use the ForceSSL Middleware to force HTTPS on requests to a go-json-rest API.
For the purposes of this demo, we are using HTTP for all requests and checking the X-Forwarded-Proto header to see if it is set to HTTPS (many routers set this to show what type of connection the client is using, such as Heroku). To do a true HTTPS test, make sure and use http.ListenAndServeTLS with a valid certificate and key file.
Additional documentation for the ForceSSL middleware can be found here.
curl demo:
curl -i 127.0.0.1:8080/
curl -H "X-Forwarded-Proto:https" -i 127.0.0.1:8080/
code:
…
Demonstrate how to setup a /.status endpoint
Inspired by memcached "stats", this optional feature can be enabled to help monitoring the service.
This example shows how to enable the stats, and how to setup the /.status route.
curl demo:
curl -i http://127.0.0.1:8080/.status
curl -i http://127.0.0.1:8080/.status
...
Output example:
{
"Pid": 21732,
"UpTime": "1m15.926272s",
"UpTimeSec": 75.926272,
"Time": "2013-03-04 08:00:27.152986 +0000 UTC",
"TimeUnix": 1362384027,
"StatusCodeCount": {
"200": 53,
"404": 11
},
"TotalCount": 64,
"TotalResponseTime": "16.777ms",
"TotalResponseTimeSec": 0.016777,
"AverageResponseTime": "262.14us",
"AverageResponseTimeSec": 0.00026214
}
code:
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
)
func main() {
api := rest.NewApi()
statusMw := &rest.StatusMiddleware{}
api.Use(statusMw)
api.Use(rest.DefaultDevStack...)
router, err := rest.MakeRou
No open issues yet, or sync has not completed.