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
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 |
spdy
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
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. |