Documentation
¶
Overview ¶
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 URL routing using a Trie based implementation, and helpers to deal with JSON requests and responses. It is not a high-level REST framework that transparently maps HTTP requests to procedure calls, on the opposite, you constantly have access to the underlying net/http objects.
Example:
package main
import (
"github.com/ant0ine/go-json-rest"
"net/http"
)
type User struct {
Id string
Name string
}
func GetUser(w *rest.ResponseWriter, req *rest.Request) {
user := User{
Id: req.PathParam("id"),
Name: "Antoine",
}
w.WriteJson(&user)
}
func main() {
handler := rest.ResourceHandler{}
handler.SetRoutes(
rest.Route{"GET", "/users/:id", GetUser},
)
http.ListenAndServe(":8080", &handler)
}
Note about the URL routing: Instead of using the usual "evaluate all the routes and return the first regexp that matches" strategy, it uses a Trie data structure to perform the routing. This is more efficient, and scales better for a large number of routes. It supports the :param and *splat placeholders in the route strings.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Request ¶
type Request struct {
*http.Request
// map of parameters that have been matched in the URL Path.
PathParams map[string]string
}
Inherit from http.Request, and provide additional methods.
func (*Request) DecodeJsonPayload ¶
Read the request body and decode the JSON using json.Unmarshal
func (*Request) UriBase ¶
Returns a URL structure for the base (scheme + host) of the application, without the trailing slash in the host
type ResourceHandler ¶
type ResourceHandler struct {
// If true, and if the client accepts the Gzip encoding, the response payloads
// will be compressed using gzip, and the corresponding response header will set.
EnableGzip bool
// If true, the JSON payload will be written in one line with no space.
DisableJsonIndent bool
// If true, the status service will be enabled. Various stats and status will
// then be available at GET /.status in a JSON format.
EnableStatusService bool
// If true, when a "panic" happens, the error string and the stack trace will be
// printed in the 500 response body.
EnableResponseStackTrace bool
// If true, the record that is logged for each response will be printed as JSON
// in the log. Convenient for log parsing.
EnableLogAsJson bool
// Custom logger, defaults to log.New(os.Stderr, "", log.LstdFlags)
Logger *log.Logger
// contains filtered or unexported fields
}
Implement the http.Handler interface and act as a router for the defined Routes. The defaults are intended to be developemnt friendly, for production you may want to turn on gzip and disable the JSON indentation.
func (*ResourceHandler) ServeHTTP ¶
func (self *ResourceHandler) ServeHTTP(origWriter http.ResponseWriter, origRequest *http.Request)
This makes ResourceHandler implement the http.Handler interface. You probably don't want to use it directly.
func (*ResourceHandler) SetRoutes ¶
func (self *ResourceHandler) SetRoutes(routes ...Route) error
Define the Routes. The order the Routes matters, if a request matches multiple Routes, the first one will be used.
type Response ¶
type Response struct {
http.ResponseWriter
// contains filtered or unexported fields
}
Inherit from an object implementing the http.ResponseWriter interface, and provide additional methods.
func (*Response) Write ¶
Overloading of the http.ResponseWriter method. Provide additional capabilities, like transparent gzip encoding.
func (*Response) WriteHeader ¶
Overloading of the http.ResponseWriter method. Just record the status code for logging.
type Route ¶
type Route struct {
// Any http method. It will be used as uppercase to avoid common mistakes.
HttpMethod string
// A string like "/resource/:id.json".
// Placeholders supported are:
// :param that matches any char to the first '/' or '.'
// *splat that matches everything to the end of the string
// (placeholder names should be unique per PathExp)
PathExp string
// Code that will be executed when this route is taken.
Func func(*Response, *Request)
}
Used with SetRoutes.
func RouteObjectMethod ¶
func RouteObjectMethod(httpMethod string, pathExp string, objectInstance interface{}, objectMethod string) Route
Create a Route that points to an object method. It can be convenient to point to an object method instead of a function, this helper makes it easy by passing the object instance and the method name as parameters.
Directories
¶
| Path | Synopsis |
|---|---|
|
examples
|
|
|
countries
command
Demonstrate simple POST GET and DELETE operations The Curl Demo: curl -i -d '{"Code":"FR","Name":"France"}' http://127.0.0.1:8080/countries curl -i -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
|
Demonstrate simple POST GET and DELETE operations The Curl Demo: curl -i -d '{"Code":"FR","Name":"France"}' http://127.0.0.1:8080/countries curl -i -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 |
|
gae/gaecountries
Demonstrate a simple Google App Engine app The Curl Demo: curl -i -d '{"Code":"FR","Name":"France"}' http://127.0.0.1:8080/countries curl -i -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
|
Demonstrate a simple Google App Engine app The Curl Demo: curl -i -d '{"Code":"FR","Name":"France"}' http://127.0.0.1:8080/countries curl -i -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 |
|
simple
command
|
|
|
spdy
command
Demonstrate how to use SPDY with github.com/shykes/spdy-go For a command line client, install spdycat from: https://github.com/tatsuhiro-t/spdylay Then: spdycat -v --no-tls -2 http://localhost:8080/users/0
|
Demonstrate how to use SPDY with github.com/shykes/spdy-go For a command line client, install spdycat from: https://github.com/tatsuhiro-t/spdylay Then: spdycat -v --no-tls -2 http://localhost:8080/users/0 |
|
users
command
Demonstrate how to use rest.RouteObjectMethod rest.RouteObjectMethod helps create a Route that points to an object method instead of just a function.
|
Demonstrate how to use rest.RouteObjectMethod rest.RouteObjectMethod helps create a Route that points to an object method instead of just a function. |
|
Special Trie implementation for HTTP routing.
|
Special Trie implementation for HTTP routing. |
