Introduction
The routing function of the Gin framework is designed based on httprouter. httprouter is a Golang implemented routing component; it uses the data structure of the radix tree (also known as radix trie or compressed prefix tree) to maintain the mapping routing relationship and route quickly through the prefix tree. Simultaneously, the interface implemented by the structure in it can be used as a HttpRouter release.
A radix tree (Radix Tree), also known as PAT a bit tree (Patricia-trie or crit-bit tree), is a more space-efficient prefix tree (Trie Tree). For each radix tree node, if the node is the only subtree, it is merged with the parent node.

HTTP Method
Common related methods ( ) have been encapsulated in the Gin framework, and direct calls will quickly register associated routes. The file location of the source code: HTTP GET, POST, PUT, DELETE, HEAD, …e.t.c.
// main.go code
package main
import (
"github.com/gin-gonic/gin" // Introduce Gin framework
"go_use/practise" // Introduced using the sample code package
)
func main() {
// Create a default routing engine
engine := gin.Default()
// Invoke the HTTP method route
practise.UseHttp(engine)
_ = engine.Run(":9090")
}
// go_use/practise/routing_use.go code
// Learn to use HTTP methods
func UseHttp(engine *gin.Engine) {
// Use the Get method
engine.GET("/get", func(context *gin.Context) {
context.JSON(200,gin.H{"msg":"request succeeded","method":"get"})
})
// Use Post method
engine.POST("/post", func(context *gin.Context) {
context.JSON(200,gin.H{"msg":"request succeeded","method":"post"})
})
// Using the PUT method
engine.PUT("/put", func(context *gin.Context) {
context.JSON(200,gin.H{"msg":"request succeeded","method":"put"})
})
// Use the DELETE method
engine.DELETE("/del", func(context *gin.Context) {
context.JSON(200,gin.H{"msg":"request succeeded","method":"del"})
})
// Use the HEAD method
engine.HEAD("/head", func(context *gin.Context) {
context.JSON(200,gin.H{"msg":"request succeeded","method":"head"})
})
}Startup log output:
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /get --> go_use/practise.UseHttp.func1 (3 handlers)
[GIN-debug] POST /post --> go_use/practise.UseHttp.func2 (3 handlers)
[GIN-debug] PUT /put --> go_use/practise.UseHttp.func3 (3 handlers)
[GIN-debug] DELETE /del --> go_use/practise.UseHttp.func4 (3 handlers)
[GIN-debug] HEAD /head --> go_use/practise.UseHttp.func5 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :9090 by default
[GIN-debug] Listening and serving HTTP on :9090Example of calling:
# GET request
$ curl -X GET http://127.0.0.1:9090/get
{"method": "get", "msg": "Request successful" }%
#The route that receives the post using the GET request will report an
error$ curl -X GET http://127.0.0.1:9090/post
404 page not found%
# POST request
$ curl -X POST http://127.0.0.1:9090/post
{"method": "post", "msg" : "Request successful" }%
# PUT request
$ curl -X PUT http://127.0.0.1:9090/put
{"method" : "put", "msg" : "Request successful" }%
# DELETE request
$ curl -X DELETE http://127.0.0.1:9090/del
{"method" : "del", "msg" : "Request successful" }%
# HEAD request
$ curl -i -X HEAD http://127.0.0.1:9090/head
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the
Warning: way you want. Consider using -I/--head instead.
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Mon, 17 May 2021 08:55:19 GMT
Content-Length: 38It should be noted that when a route is registered as a specified HTTP method, it must be requested in the same way, otherwise it will return:
404 page not found
Match all HTTP requests
Using Any methods, you can match all HTTP methods (GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE)
The usage example is as follows:
func main () {
// Create a default routing engine
engine := gin.Default()
// Match HTTP method method
engine.Any ("/all", func(context * gin. Context) {
context.JSON(200 ,gin.H{"msg" : "success" })
})
_ = engine.Run(":9090")
}Registration Rules
Definitions
According to the above example, HTTP the rules for registering method routing can be summarized as follows:
// engine := gin.Default()
engine.MethodName(path string, ...HandlerFunc)path: represents the path....HandlerFunc: One or more handler functions that receive requests.
Upload multiple HandlerFunc examples
package main
import (
"github.com/gin-gonic/gin" // Import Gin framework
)
func main () {
// Create a default routing engine
engine := gin.Default()
// Register a route and receive two HandlerFunc
engine.GET ("/handler", handFuncA, handFuncB)
_ = engine.Run(":9090")
}
func handFuncA(ctx *gin.Context) {
ctx.JSON(200, gin.H{"msg": "handFuncA"})
}
func handFuncB(ctx *gin.Context) {
ctx.JSON(200, gin.H{"msg": "handFuncB"})
}Request output:
$ curl -X GET http://127.0.0.1:9090/handler
{"msg":"handFuncA"}{"msg":"handFuncB"}Matching rules
Since the Gin route is used httprouter, and httprouter the path matching rules are arranged as follows:
/path
This type of path will only match /path.
It will not match
/path/.
- Start the service
func main () {
// Create a default routing engine
engine := gin.Default()
// Register routing
engine . GET ("/test", func(context * gin. Context ) {
context.JSON (200 , gin.H {
"msg" : "success",
})
return
})
_ = engine.Run(":9090")
}- Initiate a request
# will match
$ curl -X GET http://127.0.0.1:9090/test
{ "msg" : "success" }
# The command line request is returned, and the browser request will return normally
$ ~ curl -X GET http://127.0.0.1:9090/test/
<a href="/test"> Moved Permanently </a>When the registered routing path is:
/path, it will not match/path/, and it will be returned when requested with a command Moved Permanently, but it will be returned normally when requested with a browser. Reason:httprouterAutomatic redirection is enabled by default and/path/will be redirected to/path.
:param
:param: are the names of the parameters.
- Matching rules
| Routing Rules | Request Examples | Parameter Values |
|---|---|---|
/path/:a |
/test/finbarrs |
a=finbarrs |
/path/:a/:b |
/test/finbarrs/1 |
a=finbarrs,b=1 |
/path/:a/:b/:c |
/test/finbarrs/1/2 |
a=finbarrs,b=1,c=2 |
- Start the service
package main
import (
"github.com/gin-gonic/gin" // Import Gin framework
)
func main () {
// Create a default routing engine
engine := gin.Default()
// Register routing
engine . GET ( "/test/:name" , func(context * gin.Context) {
// Receive parameters
name := context.Param("name")
context.JSON(200, gin.H{"msg": "success", "name": name})
})
engine.GET("/test/:name/:age", func(context *gin.Context) {
// receive parameters
name := context.Param("name")
age := context.Param("age")
context.JSON(200, gin.H{
"msg": "success",
"name": name,
"phone":age,
})
})
engine.GET("/test/:name/:age/:height", func(context *gin.Context) {
// receive parameters
name := context.Param("name")
age := context.Param("age")
height := context.Param("height")
context.JSON(200, gin.H{
"msg": "success",
"name": name,
"phone":age,
"height":height,
})
})
_ = engine.Run(":9090")
}- Initiate requests
$ curl -X GET http://127.0.0.1:9090/test/finbarrs
{"msg":"success","name":"finbarrs"}
$ curl -X GET http://127.0.0.1:9090/test/finbarrs/18
{"msg":"success","name":"finbarrs","phone":"18"}
$ curl -X GET http://127.0.0.1:9090/test/finbarrs/18/170
{"height":"170","msg":"success","name":"finbarrs","phone":"18"}*param
Matches from the specified position (including the prefix
"/") to the end.
- Matching rules
| Routing Rules | Request Examples | Parameter Values |
|---|---|---|
/path/*a |
/test/finbarrs |
a=/finbarrs |
/test/finbarrs/1 |
a=finbarrs/1 |
|
/test/finbarrs/1/2 |
a=finbarrs/1/2 |
- Start the service
package main
import (
"github.com/gin-gonic/gin" // Introduce Gin framework
)
func main() {
// Create a default routing engine
engine := gin.Default()
// register route
engine.GET("/test/*param", func(context *gin.Context) {
// receive parameters
param := context.Param("param")
context.JSON(200, gin.H{"msg": "success", "name": param})
})
_ = engine.Run(":9090")
}- Initiate requests
$ curl -X GET http://127.0.0.1:9090/test/finbarrs
{"msg":"success","name":"/finbarrs"}
$ curl -X GET http://127.0.0.1:9090/test/finbarrs/1
{"msg":"success","name":"/finbarrs/1"}
$ curl -X GET http://127.0.0.1:9090/test/finbarrs/1/2
{"msg":"success","name":"/finbarrs/1/2"}