学习笔记:Gin框架笔记2 | 青训营

81 阅读4分钟

返回json格式数据

返回 JSON 格式数据是 Web 开发中的常见需求,Gin 框架提供了方便的方法来实现这个目标。下面是一些相关的知识点和示例代码。

Gin JSON 返回格式

Gin 框架提供了 JSON 方法来将 Go 结构体转换为 JSON 格式并返回给客户端。

示例代码:

import (
     "github.com/gin-gonic/gin"
     "net/http"
)

type User struct {
  Name  string `json:"name"`
  Age   int    `json:"age"`
  Email string `json:"email"`
}

func main() {
  r := gin.Default()

  // 返回 JSON 格式数据
  r.GET("/user", func(c *gin.Context) {
    user := User{
      Name:  "Alice",
      Age:   25,
      Email: "alice@example.com",
    }
    c.JSON(http.StatusOK, user)
  })

  r.Run(":8080")
}

当访问 http://localhost:8080/user 时,会返回以下 JSON 数据:

{
  "name": "Alice",
  "age": 25,
  "email": "alice@example.com"
}

在上面的示例中,定义了一个 User 结构体,它有三个属性 NameAgeEmail,并在路由处理函数中通过 c.JSON 方法将该结构体转换为 JSON 格式返回给客户端。c.JSON 方法的第一个参数是 HTTP 状态码建议使用go语言net/http包下的http.StatusOk参数(数值为200的整型变量,代表成功),在别人看代码时更好的理解,第二个参数是要返回的数据。

Gin JSON 返回的字段映射

在转换 Go 结构体为 JSON 格式时,Gin 框架默认使用结构体的字段名作为 JSON 对象的键名,可以通过 json 标签来指定键名。

例如,在上面的示例中,我们在 User 结构体的属性上加上了 json 标签,如 Name 属性上的 json:"name",这样返回的 JSON 对象的键名就是 name,而不是 Name

Gin JSON 返回的响应头

Gin 框架在返回 JSON 数据时会自动设置响应头的 Content-Typeapplication/json,告诉客户端返回的是 JSON 格式数据。

获取query、form、url三种参数

获取 query 参数

使用 Query 方法可以获取 URL 中的 query 参数。

示例代码:

  r.GET("/hello", func(c *gin.Context) {
    // 获取 query 参数
    name := c.Query("name")
    age := c.Query("age")
    c.String(200, "Hello %s, you are %s years old", name, age)
  })

在上面的示例中,我们使用 Query 方法获取了 URL 中的 nameage 参数,并将它们格式化后返回给客户端。

例如,当访问 http://localhost:8080/hello?name=Alice&age=25 时,会返回以下响应:

Hello Alice, you are 25 years old

获取 form 参数

使用 PostForm 方法可以获取 POST 请求中的表单参数。

示例代码:

  r.POST("/login", func(c *gin.Context) {
    // 获取 form 参数
    username := c.PostForm("username")
    password := c.PostForm("password")
  })

在上面的示例中,我们使用 PostForm 方法获取了 POST 请求中的 usernamepassword 参数,并进行验证。如果用户名和密码正确,返回登录成功;否则返回登录失败。

获取 URL 参数

使用 Param 方法可以获取 URL 中的参数。

示例代码:

  r.GET("/user/:id", func(c *gin.Context) {
    // 获取 URL 参数
    id := c.Param("id")
    c.String(200, "User ID is %s", id)
  })

在上面的示例中,我们定义了一个 URL /user/:id,使用 Param 方法获取了 URL 中的 id 参数,并将它格式化后返回给客户端。

例如,当访问 http://localhost:8080/user/123 时,会返回以下响应:

User ID is 123

文件上传

在 Gin 框架中,实现文件上传功能非常简单,只需要使用 FormFile 方法解析上传文件即可。下面是一个文件上传的示例代码。

import (
  "fmt"
  "log"
  "net/http"
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()

  r.POST("/upload", func(c *gin.Context) {
    // 获取上传的文件
    file, err := c.FormFile("file")
    if err != nil {
      log.Fatal(err)
    }

    // 将文件保存到本地
    err = c.SaveUploadedFile(file, file.Filename)
    if err != nil {
      log.Fatal(err)
    }

    // 返回上传成功信息
    c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
  })

  r.Run(":8080")
}

在上面的示例中,我们定义了一个 /upload 路由,并使用 FormFile 方法获取上传的文件。然后使用 SaveUploadedFile 方法将文件保存到本地,并返回上传成功信息。

客户端可以通过 multipart/form-data 格式上传文件。例如,使用 cURL 命令上传文件:

curl -X POST -F 'file=@/path/to/local/file' http://localhost:8080/upload

在上面的命令中,file 是上传表单中的文件名,@ 后面是要上传的本地文件路径。上传成功后,会返回以下响应:

'/file.txt' uploaded!

其中 file.txt 是上传的文件名。

路由组

路由组是将多个路由分组管理的一种方式,在 Gin 框架中使用 Group 方法创建。

下面是一个路由组示例:

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

func main() {
  r := gin.Default()

  // 定义路由组
  api := r.Group("/api")

  // 在路由组中定义路由
  api.GET("/users", func(c *gin.Context) {
    c.String(200, "List all users")
  })

  api.POST("/users", func(c *gin.Context) {
    c.String(200, "Create a new user")
  })

  api.PUT("/users/:id", func(c *gin.Context) {
    id := c.Param("id")
    c.String(200, "Update user %s", id)
  })

  api.DELETE("/users/:id", func(c *gin.Context) {
    id := c.Param("id")
    c.String(200, "Delete user %s", id)
  })

  r.Run(":8080")
}

在上面的示例中,我们使用 Group 方法创建了一个名为 api 的路由组,并在该路由组中定义了四个路由。这四个路由的 URL 都以 /api 开头,可以通过 api 路由组来管理。

例如,当客户端访问 http://localhost:8080/api/users 时,会返回 List all users 字符串。