Gin网络请求与路由处理——Go Gin框架(二)

创建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):用于向浏览器端输出。(返回值占时不知道含义)
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注