创建Engine(引擎)
Engine代表Gin框架的一个结构体定义。
其中包括了路由组、中间件、页面渲染接口、框架配置设置等相关内容
Engine 有以下两种创建方式:
engine1 = gin.Default() //通常使用,会默认使用Logger和Recovery中间件
engine2 = gin.New()
Recovery
中间件的作用是:如果程序执行过程中遇到了panic中断了服务,Recovery
会恢复程序的执行,并返回服务器500内部错误。
Logger
负责打印并输出日志的中间件,方便我们开发调试。
实际上 gin.Default()
内部也是调用 gin.New()
来实现的,但是前者添加了上述两个中间件。
用Engine处理HTTP请求
在实例engine中,包含很多种方法可以直接处理不同类型的HTTP请求。
HTTP协议中义工定义了八种操作方式,分别是:OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT。
实际上开发上常用的也只有GET、POST、DELETE等几种操作方式。
通用处理请求
engine中可以直接进行HTTP请求的处理,在engine中,可以使用Handle方法进行HTTP请求的处理。Handle方法包含三个参数,如下所示:
func (group *RouterGroup) Handle(httpMethod, relativePath string, handles ...HandlerFunc) IRoutes
httpMethod string
:第一个参数表示要处理的HTTP的请求类型,是"GET"
、"POST"
、"DELETE"
等八种操作方式的其中一种relativePath string
:第二个参数表示要解析的接口,由开发者定义。handlers Handlerfunc
:第三个参数是处理对应的请求的代码的定义。
分类处理请求
func (group *RouterGroup) POST(relativePath string, handlers ...HandlerFunc) IRoutes
func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes
func (group *RouterGroup) DELETE(relativePath string, handlers ...HandlerFunc) IRoutes
//等几个常用的请求处理方法
每个参数的具体含义,请参考通用处理请求中的参数说明。
实例
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
//第一种处理http请求的方法,使用handle
//访问 /hello?name=xxxxx
engine.Handle("GET", "/hello", func(context *gin.Context) {
//context里面封装了一个上下文环境变量,在这里面当中有我们经常操作的属性或者方法。
path := context.FullPath() //获取我们本次请求的接口
fmt.Println(path)
//获取GET中的参数
name := context.DefaultQuery("name", "null") //获取具体参数,1.哪个字段 2.若获取不到的默认值
fmt.Println(name)
//输出
_, _ = context.Writer.Write([]byte("hello, " + name))
})
//第二种处理http请求的方法(分类处理)
//访问 /login
engine.POST("/login", func(context *gin.Context) {
fmt.Println(context.FullPath())
//解析POST
username := context.PostForm("username")
//这种方法会返回是否成功获取Form里的值,以进行判断
password, 获取成功 := context.GetPostForm("password")
if 获取成功 {
fmt.Println(username, "n", password)
_, _ = context.Writer.Write([]byte(username + "登录,密码为:" + password))
}
})
//delete
//在访问路径中,指定id的方法
//即:/delete/user/123或/delete/user/456(最后一项是一个变量)
engine.DELETE("/delete/user/:id", func(context *gin.Context) {
//获取路径中的变量值
userID := context.Param("id")
fmt.Println("删除用户:" + userID)
context.Writer.Write([]byte("删除用户:"+userID))
})
//运行这个引擎
_ = engine.Run(":8088")
}
上述示例代码中,包含了几个新的函数:
func (c *Context) FullPath() string
: 该函数返回被访问路由的全路径。对于没有找到的路径,返回空func (c *Context) DefaultQuery(key string, defaultValue string) string
: 该函数用于GET请求中,用于获取GET
请求中的参数。key string
:要获取GET请求中的哪个字段defaultValue string
:若获取不到则返回的默认值
func (c *Context) PostForm(key string) string
func (c *Context) GetPostForm(key string) (string, bool)
: 这两个函数用于获取POST请求中的参数。key string
:要获取POST请求中的哪个字段GETPostForm
的第二个bool返回值,用于返回是否成功获取到该字段
func (c *Context) Param(key string) string
: 用于获取访问路径中的参数值。key string
:要获取访问路径请求中的哪个字段,该字段在路径中的表示方法为/:key
func (ResponseWriter) Write([]byte) (int, error)
:用于向浏览器端输出。(返回值占时不知道含义)