Comment on page
Core Services
By default, Macaron injects some services to power your application, those services are known as core services, which means you can directly use them as handler arguments without any additional work.
This service is represented by type
*macaron.Context
. This is the very core service for everything you do upon Macaron. It contains all the information you need for request, response, templating, data store, and inject or retrieve other services.To use it:
package main
import "gopkg.in/macaron.v1"
func Home(ctx *macaron.Context) {
// ...
}
Method
Context.Next
is an optional feature that Middleware Handlers can call to yield the until after the other Handlers have been executed. This works really well for any operations that must happen after an HTTP request:// log before and after a request
m.Use(func(ctx *macaron.Context, log *log.Logger){
log.Println("before a request")
ctx.Next()
log.Println("after a request")
})
The very basic usage of cookie is just:
To use them:
// ...
m.Get("/set", func(ctx *macaron.Context) {
ctx.SetCookie("user", "Unknwon", 1)
})
m.Get("/get", func(ctx *macaron.Context) string {
return ctx.GetCookie("user")
})
// ...
Use following arguments order to set more properties:
SetCookie(<name>, <value>, <max age>, <path>, <domain>, <secure>, <http only>,<expires>)
.For example, the most advanced usage would be:
SetCookie("user", "unknwon", 999, "/", "localhost", true, true, time.Now())
.Note that order is fixed.
There are also more secure cookie support. First, you need to call
macaron.SetDefaultCookieSecret
, then use it by calling:These two methods uses default secret string you set globally to encode and decode values.
To use them:
// ...
m.SetDefaultCookieSecret("macaron")
m.Get("/set", func(ctx *macaron.Context) {
ctx.SetSecureCookie("user", "Unknwon", 1)
})
m.Get("/get", func(ctx *macaron.Context) string {
name, _ := ctx.GetSecureCookie("user")
return name
})
// ...
For people who wants even more secure cookies that change secret string every time, just use:
To use them:
// ...
m.Get("/set", func(ctx *macaron.Context) {
ctx.SetSuperSecureCookie("macaron", "user", "Unknwon", 1)
})
m.Get("/get", func(ctx *macaron.Context) string {
name, _ := ctx.GetSuperSecureCookie("macaron", "user")
return name
})
// ...
- To set/get URL parameters:
ctx.SetParams
/ctx.Params
,ctx.ParamsEscape
,ctx.ParamsInt
,ctx.ParamsInt64
,ctx.ParamsFloat64
- To get query parameters:
ctx.Query
,ctx.QueryEscape
,ctx.QueryInt
,ctx.QueryInt64
,ctx.QueryFloat64
,ctx.QueryStrings
,ctx.QueryTrim
This service can be injected by function
macaron.Logger
. It is responsible for your application routing log.To use it:
package main
import "gopkg.in/macaron.v1"
func main() {
m := macaron.New()
m.Use(macaron.Logger())
// ...
}
[Macaron] Started GET /docs/middlewares/core.html for [::1]
[Macaron] Completed /docs/middlewares/core.html 200 OK in 2.114956ms
This service can be injected by function
macaron.Recovery
. It is responsible for recovering your application when panic happens.To use it:
package main
import "gopkg.in/macaron.v1"
func main() {
m := macaron.New()
m.Use(macaron.Recovery())
// ...
}
This service can be injected by function
macaron.Static
. It is responsible for serving static resources of your application, it can be injected as many times as you want if you have multiple static directories.To use it:
package main
import "gopkg.in/macaron.v1"
func main() {
m := macaron.New()
m.Use(macaron.Static("public"))
m.Use(macaron.Static("assets"))
// ...
}
By default, when you try to request a directory, this service will not list directory files. Instead, it tries to find the
index.html
file.[Macaron] Started GET /css/prettify.css for [::1]
[Macaron] [Static] Serving /css/prettify.css
[Macaron] Completed /css/prettify.css 304 Not Modified in 97.584us
[Macaron] Started GET /imgs/macaron.png for [::1]
[Macaron] [Static] Serving /imgs/macaron.png
[Macaron] Completed /imgs/macaron.png 304 Not Modified in 123.211us
[Macaron] Started GET /js/gogsweb.min.js for [::1]
[Macaron] [Static] Serving /js/gogsweb.min.js
[Macaron] Completed /js/gogsweb.min.js 304 Not Modified in 47.653us
[Macaron] Started GET /css/main.css for [::1]
[Macaron] [Static] Serving /css/main.css
[Macaron] Completed /css/main.css 304 Not Modified in 42.58us
Suppose you have following directory structure:
public/
|__ html
|__ index.html
|__ css/
|__ main.css
Results:
Request URL | Match File |
/html/main.html | None |
/html/ | index.html |
/css/main.css | main.css |
package main
import "gopkg.in/macaron.v1"
func main() {
m := macaron.New()
m.Use(macaron.Static("public",
macaron.StaticOptions{
// Prefix is the optional prefix used to serve the static directory content. Default is empty string.
Prefix: "public",
// SkipLogging will disable [Static] log messages when a static file is served. Default is false.
SkipLogging: true,
// IndexFile defines which file to serve as index if it exists. Default is "index.html".
IndexFile: "index.html",
// Expires defines which user-defined function to use for producing a HTTP Expires Header. Default is nil.
// https://developers.google.com/speed/docs/insights/LeverageBrowserCaching
Expires: func() string {
return time.Now().Add(24 * 60 * time.Minute).UTC().Format("Mon, 02 Jan 2006 15:04:05 GMT")
},
}))
// ...
}
In case you have multiple static directories, there is one helper function
macaron.Statics
to make your life easier.To use it:
// ...
m.Use(macaron.Statics(macaron.StaticOptions{}, "public", "views"))
// ...
This will register both
public
and views
as static directories.This service is represented by type
*log.Logger
. It is optional to use, but for convenience when you do not have a global level logger.To use it:
package main
import (
"log"
"gopkg.in/macaron.v1"
)
func main() {
m := macaron.Classic()
m.Get("/", myHandler)
m.Run()
}
func myHandler(ctx *macaron.Context, logger *log.Logger) string {
logger.Println("the request path is: " + ctx.Req.RequestURI)
return "the request path is: " + ctx.Req.RequestURI
}
This service is represented by type
http.ResponseWriter
. It is optional to use, normally, you should use *macaron.Context.Resp
.To use it:
package main
import (
"gopkg.in/macaron.v1"
)
func main() {
m := macaron.Classic()
m.Get("/", myHandler)
m.Run()
}
func myHandler(ctx *macaron.Context) {
ctx.Resp.Write([]byte("the request path is: " + ctx.Req.RequestURI))
}
This service is represented by type
*http.Request
. It is optional to use, normally, you should use *macaron.Context.Req
.Besides, this service provides three methods to help you easily retrieve request body:
To use them:
package main
import (
"gopkg.in/macaron.v1"
)
func main() {
m := macaron.Classic()
m.Get("/body1", func(ctx *macaron.Context) {
reader, err := ctx.Req.Body().ReadCloser()
// ...
})
m.Get("/body2", func(ctx *macaron.Context) {
data, err := ctx.Req.Body().Bytes()
// ...
})
m.Get("/body3", func(ctx *macaron.Context) {
data, err := ctx.Req.Body().String()
// ...
})
m.Run()
}
Notice that request body can only be read once.
Sometimes you need to pass type
*http.Request
as an argument, you should use *macaron.Context.Req.Request
.Last modified 4yr ago