Go语言框架之Gin使用(一) | 青训营

133 阅读3分钟

Gin框架使用入门

Gin是一个使用Go语言编写的HTTP Web框架,它拥有极高的性能和简洁明快的语法,在Go语言开发社区中非常受欢迎。Gin的API简单易用,对初学者十分友好,而且提供了中文文档,容易上手。

Gin的初始化

我们可以十分方便快速地使用Gin完成一个接口的编写。

func main() {
    router := gin.Default()
    router.GET("/", func(c *gin.Context) {
        c.String(http.StatusOK, "Hello World")
    })
    router.Run(":8080") 
}

router := gin.Default():按照默认配置初始化路由并返回一个Engine实例,用router来接受指针。

然后通过router.Get方法绑定路由规则和路由函数。不同于net/http库的路由函数,gin进行了封装,把requestresponse都封装到了gin.Context的上下文环境中,让代码更加简洁。

最后启用路由的Run方法开始监听端口。还可以用net\http包中的http.ListenAndServe(":8080", router)启动监听(事实上,Run方法就是对net\http包中的ListenAndServe方法的进一步封装),或者自定义HTTP服务器配置。默认Gin会把Web服务运行在本机的0.0.0.0:8080端口上,这样内网都可以访问,如果你只想本机访问,可以改成router.Run("127.0.0.1:8080")。

请求

Gin支持Rest风格的API,意思即为在客户端与Web服务器之间进行交互通信的时候,使用HTTP协议中的4个请求方法代表不同的动作。

  • GET 获取资源
  • POST 新建资源
  • PUT 更新资源
  • DELETE 删除资源 Rest风格的API也是前后端分离架构中最常见的风格。

请求参数

为了方便地从请求中获取参数,Gin框架提供了一系列的方法。

查询参数Query

下面是几个典型的取得Query的方法。

  • c.Query("key") 如果存在对应的键的话,获取其值;否则返回空值。
  • c.GetQuery("key")"Query()类似,但它有两个返回值。如果在"key"键,(即使所对应的值是空字符串),它也会返回该值和True,否则它会返回("", false)。
  • c.QueryArray("key") 为给定的查询键返回一组字符串的切片。切片的长度取决于给定键所对应的值的数量。
  • c.DefaultQuery("key", "none")Query()类似,但是如果不存在对应的键的话,会返回指定的defaultValue字符串,本例中为none。

动态参数Param

router.GET("/user/:id", func(c *gin.Context) {
    id := c.Param("id")
})
  • c.Param("key") 返回URL参数的值,上例中,加入向/user/john发送一个Get请求,则会得到id == "john"。

表单参数PostForm

  • c.PostForm 可以接收multipart/form-dataapplication/x-www-form-urlencoded类型的表单,PostForm从表单返回指定的键(如果存在)所对应的值,否则返回空字符串("")。
  • c.GetPostForm GetPostForm类似于PostForm。当指定的键存在(即使该值是空字符串)时,返回对应的值和True,否则返回("", false)。
  • c.PostFormArray 为给定的查询表单的键返回一组字符串的切片。切片的长度取决于给定键所对应的值的数量。

原始参数GetRawData

  • c.GetRawData 获取客户端提交的请求体信息(原始数据)。
func bindJson(c *gin.Context, obj any) (err error) {
  body, _ := c.GetRawData()
  contentType := c.GetHeader("Content-Type")
  switch contentType {
  case "application/json":
    err = json.Unmarshal(body, &obj)
    if err != nil {
      fmt.Println(err.Error())
      return err
    }
  }
  return nil
}

获取请求头参数

  • c.GetHeader 大小写不分,且返回切片中的第一个数据。(事实上就是http包里c.Request.Header.Get(key)的封装。)