Gin实战演练

本文深入探讨Gin框架的使用,包括RESTful API设计、路由参数、查询参数处理、数组和Map的接收、Form表单及文件上传、分组路由与中间件、JSON和模板渲染以及异步协程的运用。详细介绍了Gin的多种功能及其内部原理,旨在提升Gin的实战应用能力。
摘要由CSDN通过智能技术生成

Gin实战演练

1 gin的简单使用

package main

import "github.com/gin-gonic/gin"

func main() {
   
   // Default方法的主要作用是实例化一个带有日志、故障恢复中间件的引擎。
   r := gin.Default() //实例化一个gin对象
   // 定义请求
   //定义一个GET请求的路由,参数一是路由地址,也就是在浏览器访问的相对路径,
   //                     参数二是一个匿名函数,函数内部用于业务逻辑处理。
   r.GET("/login", func(c *gin.Context) {
   
      c.JSON(200, gin.H{
    //JSON内容可以通过gin提供的H方法来构建,非常方便。
         "msg": "login", //调用JSON方法返回数据。JSON的操作非常简单,参数一是状态码,参数二是JSON的内容。
      })
   })
   // Run方法最终会调用内置http库的ListenAndServe方法来监听端口,如果不传参数默认监听80端口,
   // 也可以通过参数来变更地址和端口。
   r.Run(":12005")
}

2 RESTful API

RESTful 是⽹络应⽤程序的⼀种设计⻛格和开发⽅式,每⼀个URI代表⼀种资源,客户端通过 POST 、 DELETE 、 PUT 、 GET 四种请求⽅式来对资源做增删改查的操作。

同样的,Gin框架给我们提供的除这4种动词外,还有 PATCH 、 OPTION 、 HEAD 等,详细内容可以查看 rentergroup.go ⽂件的IRoutes接⼝

// IRoutes defines all router handle interface.
type IRoutes interface {
   
   Use(...HandlerFunc) IRoutes

   Handle(string, string, ...HandlerFunc) IRoutes
   Any(string, ...HandlerFunc) IRoutes
   GET(string, ...HandlerFunc) IRoutes
   POST(string, ...HandlerFunc) IRoutes
   DELETE(string, ...HandlerFunc) IRoutes
   PATCH(string, ...HandlerFunc) IRoutes
   PUT(string, ...HandlerFunc) IRoutes
   OPTIONS(string, ...HandlerFunc) IRoutes
   HEAD(string, ...HandlerFunc) IRoutes

   StaticFile(string, string) IRoutes
   Static(string, string) IRoutes
   StaticFS(string, http.FileSystem) IRoutes
}

例如接口:

func main() {
   
   router := gin.Default()
   // 请求动词的第一个参数是请求路径,第二个参数是用于逻辑处理的函数
   router.POST("/article", func(c *gin.Context) {
   
      c.String(200, "article post")
   })
   router.DELETE("/article", func(c *gin.Context) {
   
      c.String(200, "article delete")
   })
    
    router.GET("/article/:id/:action", func(c *gin.Context) {
   
		id := c.Param("id")
		action := c.Param("action")
		fmt.Printf("2 /article/:id->%s, action:%s\n", id, action)
		c.String(200, id+" "+action)
	})

	router.Run(":8080")
}
  • 通过web访问url

  • 使用curl命令来访问url

    / 测试方法
    // curl -X PUT http://localhost:8080/article
    // curl -X POST http://localhost:8080/article
    // curl -X GET http://localhost:8080/article
    // curl -X DELETE http://localhost:8080/article
    

路由参数

:路由

这种匹配模式是精确匹配的,只能匹配⼀个

访问:http://localhost:8080/users/123

输出:123

func main() {
   
   r := gin.Default()
   r.GET("/users/:id", func(c *gin.Context) {
   
      id := c.Param("id")
      c.String(200, "The user id is  %s", id)
   })
   r.Run(":8080")
}
*路由

还有⼀种不常⽤的就是 * 号类型的参数,表示匹配所有,结果是⼀个 / 开头的路径字符串

访问:http://localhost:8080/users/123

输出:/123

func main() {
   
   r := gin.Default()
   r.GET("/users/*id", func(c *gin.Context) {
   
      id := c.Param("id")
      c.String(200, "The user id is  %s", id)
   })
   r.Run(":8080")
}
特别说明⼀点

访问 http://localhost:8080/users时候,会被重定向到 http://localhost:8080/users/,根本原因在于 /users 没有匹配的路由,但是有匹配 /users/ 的路由,所以就会被重定向 到 /users/ ,如下:

func main() {
   
   r := gin.Default()
   r.GET("/users/*id", func(c *gin.Context) {
   
      id := c.Param("id")
      c.String(200, "The user id is  %s", id)
   })
}

禁止重定向

r.RedirectTrailingSlash = false

加上如上设置之后,访问 http://localhost:8080/users,是访问不成功的,因为没有服务器去处理这个url

3 Gin获取查询参数

例如:

http://127.0.0.1:8080/users?k1=v1&k2=v2

以 ? 为起点,后⾯的 k=v&k1=v1&k2=v2 这样的字符串就是查询参数

上述案例中有2个参数键值对,通过&来连接:

k1=v1
k2=v2

可以使用gin框架中的如下接口来获取实际的参数值

// 3-2-url-param.go url参数获取
package main

import (
   "fmt"

   "github.com/gin-gonic/gin"
)

func main() {
   
   r := gin.Default()
   r.GET("/", func(c *gin.Context) {
   
      c.DefaultQuery("id", "0")
      value, ok := c.GetQuery("id") // 适合用来判断是否存在该参数

      if ok {
   
         fmt.Println("id:", value)
      } else {
   
         fmt.Println("id: nil")
      }

      c.String(200, c.DefaultQuery("wechat", "default baidu_org"))
   })
   r.Run(":8080")
}

实际GetQuery具体实现:

func (c *Context) GetQuery(key string) (string, bool) {
   
   if values, ok := c.GetQueryArray(key); ok {
   
      return values[0], ok
   }
   return "", false
}

DefaultQuery的具体实现也是调用GetQuery:


                
好的,让我们来讲一下如何使用Gin框架进行项目实战。 首先,我们需要安装Gin框架。可以使用以下命令进行安装: ``` go get -u github.com/gin-gonic/gin ``` 接下来,我们可以创建一个简单的web服务。在这个例子中,我们将创建一个API,用于获取用户信息。我们将使用以下代码: ```go package main import ( "net/http" "github.com/gin-gonic/gin" ) type User struct { Name string `json:"name"` Email string `json:"email"` } func main() { router := gin.Default() router.GET("/users/:id", func(c *gin.Context) { id := c.Param("id") user := User{ Name: "John Doe", Email: "johndoe@example.com", } c.JSON(http.StatusOK, gin.H{ "id": id, "user": user, }) }) router.Run(":8080") } ``` 在这个例子中,我们定义了一个User结构体和一个处理路由的函数。当我们访问/users/:id路由时,会返回一个JSON格式的响应,包含用户的信息。 接下来,我们可以使用PostgreSQL数据库来存储和检索用户信息。我们可以使用以下代码连接到PostgreSQL: ```go package main import ( "database/sql" "log" "net/http" "github.com/gin-gonic/gin" _ "github.com/lib/pq" ) type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` } func main() { db, err := sql.Open("postgres", "user=postgres password=postgres dbname=postgres sslmode=disable") if err != nil { log.Fatalln(err) } router := gin.Default() router.GET("/users/:id", func(c *gin.Context) { id := c.Param("id") var user User err := db.QueryRow("SELECT id, name, email FROM users WHERE id = $1", id).Scan(&user.ID, &user.Name, &user.Email) if err != nil { log.Println(err) c.JSON(http.StatusInternalServerError, gin.H{ "error": "Internal server error", }) return } c.JSON(http.StatusOK, gin.H{ "id": id, "user": user, }) }) router.Run(":8080") } ``` 在这个例子中,我们在路由处理函数中查询了一个名为users的表,该表包含用户的信息。我们使用`github.com/lib/pq`库来连接到PostgreSQL数据库。 以上就是使用Gin框架进行项目实战的基本流程。当然,具体的项目实战过程中,需要根据具体需求进行更加详细的开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值