返回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 结构体,它有三个属性 Name、Age 和 Email,并在路由处理函数中通过 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-Type 为 application/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 中的 name 和 age 参数,并将它们格式化后返回给客户端。
例如,当访问 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 请求中的 username 和 password 参数,并进行验证。如果用户名和密码正确,返回登录成功;否则返回登录失败。
获取 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 字符串。