mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-23 10:02:10 +08:00
Merge branch 'master' into master
This commit is contained in:
commit
e8f5cc0422
20
README.md
20
README.md
@ -572,6 +572,10 @@ $ curl -v -X POST \
|
|||||||
{"error":"Key: 'Login.Password' Error:Field validation for 'Password' failed on the 'required' tag"}
|
{"error":"Key: 'Login.Password' Error:Field validation for 'Password' failed on the 'required' tag"}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Skip validate**
|
||||||
|
|
||||||
|
When running the above example using the above the `curl` command, it returns error. Because the example use `binding:"required"` for `Password`. If use `binding:"-"` for `Password`, then it will not return error when running the above example again.
|
||||||
|
|
||||||
### Custom Validators
|
### Custom Validators
|
||||||
|
|
||||||
It is also possible to register custom validators. See the [example code](examples/custom-validation/server.go).
|
It is also possible to register custom validators. See the [example code](examples/custom-validation/server.go).
|
||||||
@ -1082,14 +1086,26 @@ Gin allow by default use only one html.Template. Check [a multitemplate render](
|
|||||||
|
|
||||||
### Redirects
|
### Redirects
|
||||||
|
|
||||||
Issuing a HTTP redirect is easy:
|
Issuing a HTTP redirect is easy. Both internal and external locations are supported.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
r.GET("/test", func(c *gin.Context) {
|
r.GET("/test", func(c *gin.Context) {
|
||||||
c.Redirect(http.StatusMovedPermanently, "http://www.google.com/")
|
c.Redirect(http.StatusMovedPermanently, "http://www.google.com/")
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
Both internal and external locations are supported.
|
|
||||||
|
|
||||||
|
Issuing a Router redirect, use `HandleContext` like below.
|
||||||
|
|
||||||
|
``` go
|
||||||
|
r.GET("/test", func(c *gin.Context) {
|
||||||
|
c.Request.URL.Path = "/test2"
|
||||||
|
r.HandleContext(c)
|
||||||
|
})
|
||||||
|
r.GET("/test2", func(c *gin.Context) {
|
||||||
|
c.JSON(200, gin.H{"hello": "world"})
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### Custom Middleware
|
### Custom Middleware
|
||||||
|
2
gin.go
2
gin.go
@ -329,7 +329,7 @@ func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// HandleContext re-enter a context that has been rewritten.
|
// HandleContext re-enter a context that has been rewritten.
|
||||||
// This can be done by setting c.Request.Path to your new target.
|
// This can be done by setting c.Request.URL.Path to your new target.
|
||||||
// Disclaimer: You can loop yourself to death with this, use wisely.
|
// Disclaimer: You can loop yourself to death with this, use wisely.
|
||||||
func (engine *Engine) HandleContext(c *Context) {
|
func (engine *Engine) HandleContext(c *Context) {
|
||||||
c.reset()
|
c.reset()
|
||||||
|
@ -139,7 +139,7 @@ func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc) IRou
|
|||||||
return group.returnObj()
|
return group.returnObj()
|
||||||
}
|
}
|
||||||
|
|
||||||
// StaticFile registers a single route in order to server a single file of the local filesystem.
|
// StaticFile registers a single route in order to serve a single file of the local filesystem.
|
||||||
// router.StaticFile("favicon.ico", "./resources/favicon.ico")
|
// router.StaticFile("favicon.ico", "./resources/favicon.ico")
|
||||||
func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes {
|
func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes {
|
||||||
if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") {
|
if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user