**设置路由** 分别使用GET、POST、PUT、PATCH、DELETE和OPTIONS访问方式 ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { // 注册一个默认的路由器 router := gin.Default() // 最基本的用法 router.GET("/appGet", func(c *gin.Context) { // 回复一个200OK,在client的http-get的resp的body中获取数据 c.String(http.StatusOK, "appGet OK") }) router.POST("/appPost", func(c *gin.Context) { // 回复一个200 OK, 在client的http-post的resp的body中获取数据 c.String(http.StatusOK, "appPost OK") }) router.PUT("/appPut", func(c *gin.Context) {}) router.DELETE("/appDelete", func(c *gin.Context) {}) router.PATCH("/appPatch", func(c *gin.Context) {}) router.HEAD("/appHead", func(c *gin.Context) {}) router.OPTIONS("/appOptions", func(c *gin.Context) {}) // router.Run() // 不传参数,默认是8080端口 // 绑定端口是 8000 ,注意是要加:" router.Run(":8000") } ~~~ 编译运行 Get方式请求:http://0.0.0.0:8000/appGet 返回:appGet OK Post方式请求:http://0.0.0.0:8000/appPost 返回:appPost OK **带参数的路由** 1)使用gin.Context中的Param方法解析 ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) // 处理带参数的path-GET func getParameter(c *gin.Context) { // 回复一个200 OK,获取传入的参数 nickname := c.Param("nickname") passwd := c.Param("passwd") c.String(http.StatusOK, "参数:%s %s get parameter OK", nickname, passwd) } // 处理带参数的path-POST func postParameter(c *gin.Context) { // 回复一个200 OK,获取传入的参数 nickname := c.Param("nickname") passwd := c.Param("passwd") c.String(http.StatusOK, "参数:%s %s post parameter OK", nickname, passwd) } // 注意':'和'*'的区别 func optionalParameter(c *gin.Context) { // 回复一个200 OK,获取传入的参数 nickname := c.Param("nickname") passwd := c.Param("passwd") c.String(http.StatusOK, "参数:%s %s optional parameter OK", nickname, passwd) } func main() { router := gin.Default() // 注意':'必须要匹配,'*'选择匹配,即存在就匹配,否则可以不考虑 router.GET("/appGet/:nickname/:passwd", getParameter) router.POST("/appPost/:nickname/:passwd", postParameter) router.GET("/optional/:nickname/*passwd", optionalParameter) router.Run(":8000") } ~~~ 注意:定义参数的方法有两个辅助符号':'和'*'。 如果使用':'参数方法,那么这个参数是必须要匹配的。 如果使用'*'参数, 那么这个参数是可选的。 编译运行 Get方式请求:http://0.0.0.0:8000/appGet/nickname=oldboy/passwd=123456 返回:参数:nickname=oldboy passwd=123456 get parameter OK Post方式请求:http://0.0.0.0:8000/appPost/nickname=oldboy/passwd=123456 返回:参数:nickname=oldboy passwd=123456 post parameter OK 可选参数: Get方式请求:http://0.0.0.0:8000/optional/nickname=oldboy/passwd=123456 返回:参数:nickname=oldboy /passwd=123456 optional parameter OK http://0.0.0.0:8000/optional/nickname=oldboy/ 返回:参数:nickname=oldboy / optional parameter OK 2)使用gin.Context中的Query方法解析,类似于正常的URL中的参数传递 ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) // 使用Query获取参数 func getParameter(c *gin.Context) { // 回复一个200 OK,获取传入的参数 nickname := c.Query("nickname") passwd := c.Query("passwd") c.String(http.StatusOK, "参数:%s %s get parameter OK", nickname, passwd) } // 使用Query获取参数 func postParameter(c *gin.Context) { // 回复一个200 OK,获取传入的参数 nickname := c.Query("nickname") passwd := c.Query("passwd") c.String(http.StatusOK, "参数:%s %s post parameter OK", nickname, passwd) } func main() { router := gin.Default() // 使用gin的Query参数形式 router.GET("/appGet", getParameter) router.POST("/appPost", postParameter) router.Run(":8000") } ~~~ 编译运行 Get方式请求:http://0.0.0.0:8000/appGet?nickname=oldboy&passwd=123456 返回:参数:oldboy 123456 get parameter OK Post方式请求:http://0.0.0.0:8000/appPost?nickname=oldboy&passwd=123456 返回:参数:oldboy 123456 post parameter OK 3)使用gin.Context中的PostForm方法解析 我们需要将参数放在请求的Body中传递, 而不是URL中 ~~~ package main import "github.com/gin-gonic/gin" // 参数是form中获得,即从Body中获得,忽略URL中的参数 func postParameter(c *gin.Context) { message := c.PostForm("message") extra := c.PostForm("extra") nick := c.DefaultPostForm("nick", "anonymous") c.JSON(200, gin.H{ "status": "postParameter:posted", "message": message, "nick": nick, "extra": extra, }) } func main() { router := gin.Default() // 使用post_form形式,注意必须要设置Post的type, // 同时此方法中忽略URL中带的参数,所有的参数需要从Body中获得 router.POST("/appPost", postParameter) router.Run(":8000") } ~~~ 由于我们使用了request Body,那么就需要指定Body中数据的形式,此处是form格式,即application/x-www-form-urlencoded。常见的几种http提交数据方式有: application/x-www-form-urlencoded; multipart/form-data; application/json; text/xml。具体使用请google. 在服务端, 使用message := c.PostForm("message")方法解析参数,然后进行处理。 客户端请求代码: ~~~ package main import ( "fmt" "io/ioutil" "net/http" "strings" ) var resp *http.Response func main() { // 使用post_form形式,注意必须要设置Post的type,同时此方法中忽略URL中带的参数,所有的参数需要从Body中获得 resp, _ = http.Post("http://0.0.0.0:8000/appPost", "application/x-www-form-urlencoded", strings.NewReader("message=hello&extra=world")) helpRead(resp) } // 用于读取resp的body func helpRead(resp *http.Response) { defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("ERROR2!: ", err) } fmt.Println(string(body)) } ~~~ 获取请求头信息 ~~~ ua := c.GetHeader("User-Agent") ct := c.GetHeader("Content-Type") ~~~ 设置请求头信息 ~~~ ua := c.Header("User-Agent","Mozilla/5.0") ct := c.Header("Content-Type","text/html; charset=utf-8") ~~~ **路由分组** ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() // g1 g1 := router.Group("/g1") { g1.GET("/login", func(c *gin.Context) { c.String(http.StatusOK, "/g1/login OK") }) g1.GET("/submit", func(c *gin.Context) {}) g1.GET("/read", func(c *gin.Context) {}) } // g2 g2 := router.Group("/g2") { g2.POST("/login", func(c *gin.Context) { c.String(http.StatusOK, "/g2/login OK") }) g2.POST("/submit", func(c *gin.Context) {}) g2.POST("/read", func(c *gin.Context) {}) } router.Run(":8000") } ~~~ 编译运行 Get方式请求:http://0.0.0.0:8000/g1/login 返回:/g1/login OK Post方式请求:http://0.0.0.0:8000/g2/login 返回:/g2/login OK **middleware中间件** 注意,gin.Default() 默认是加载了一些框架内置的中间件的,而 gin.New() 则没有,根据需要自己手动加载中间件。 ~~~ package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.New() r.Use(gin.Logger()) r.Use(gin.Recovery()) // 在单个路由中使用 MyBenchLogger 中间件 r.GET("/benchmark", MyBenchLogger(), func(c *gin.Context) {}) authorized := r.Group("/") // 在路由组中使用中间件 authorized.Use(func(c *gin.Context) {}) { authorized.POST("/login", func(c *gin.Context) { c.String(http.StatusOK, "/login OK") }) authorized.POST("/submit", func(c *gin.Context) {}) authorized.POST("/read", func(c *gin.Context) {}) // testing group testing := authorized.Group("testing") testing.GET("/analytics", func(c *gin.Context) { c.String(http.StatusOK, "/testing/analytics OK") }) } // Listen and serve on 0.0.0.0:8080 r.Run(":8000") } // 中间件示例 func MyBenchLogger() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("before middleware") c.Set("request", "clinet_request") c.Next() fmt.Println("before middleware") } } ~~~ 编译运行 Get方式请求:http://0.0.0.0:8000/testing/analytics 返回:/testing/analytics OK Post方式请求:http://0.0.0.0:8000/login 返回:/login OK **静态文件服务** 可以向客户端展示本地的一些文件信息, 例如显示某路径下地文件。服务端代码示例: ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() // 下面测试静态文件服务 // 显示当前文件夹下的所有文件/或者指定文件 router.StaticFS("/showDir", http.Dir(".")) // router.StaticFS("/files", http.Dir("/bin")) router.Static("/files", "/bin") router.StaticFile("/image", "./oldboy/1.jpg") router.Run(":8000") } ~~~ 首先你需要在服务器的路径下创建一个oldboy文件夹,并且放入1.jpg文件。如果已经存在请忽略。 在浏览器中输入: 0.0.0.0:8000/showDir 页面返回:服务器当前路径下地文件信息 在浏览器中输入: 0.0.0.0:8000/files 页面返回:服务器/bin目录下地文件信息 在浏览器中输入: 0.0.0.0:8000/image 页面返回:服务器./oldboy/1.jpg图片