文章

【Gin】response - 响应json

服务端返回json格式数据,服务端向客户端响应JSON。

【Gin】response - 响应json

在使用 Gin 框架开发 Web 应用时,常常需要向客户端返回 JSON 格式的数据。Gin 提供了非常简便的方法来实现这一点。

c.JSON()

Gin 提供了 c.JSON() 方法,可以轻松地将数据以 JSON 格式返回给客户端。该方法接受两个参数:HTTP 状态码和要返回的数据。

1
2
3
4
5
6
7
func(c *gin.Context) {
  c.JSON(http.StatusOK, gin.H{
    "code": 0,
    "msg": "Hello, Gin!",
    "data": nil,
  })
}

在上面的示例中,gin.H 是一个快捷方式,用于创建一个 map[string]interface{} 类型的对象,方便我们构建 JSON 响应。

示例代码

下面是一个完整的示例,展示了如何使用 Gin 框架返回 JSON 响应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import (
  "net/http"
  "github.com/gin-gonic/gin"
)

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

  r.GET("/json", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "code": 0,
      "msg": "Hello, Gin!",
      "data": nil,
    })
  })

  r.Run(":8080") // 启动服务器,监听端口8080
}

在这个示例中,当客户端发送 GET 请求到 /json 路径时,服务器会返回一个 JSON 响应,包含状态码、消息和数据字段。 运行该程序,访问 http://localhost:8080/json,你将看到如下 JSON 响应:

1
2
3
4
5
{
  "code": 0,
  "msg": "Hello, Gin!",
  "data": null
}

通过这种方式,Gin 框架使得返回 JSON 响应变得非常简单和高效,极大地提升了开发效率。

封装响应

为了统一响应格式,可以封装一个响应函数,resp/resp.go文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package resp

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

var codeMap = map[int]string{
  0:    "成功:)",
  1000: "服务错误", // 默认错误
  1001: "权限错误",
  1002: "角色错误",
}

func GetMsg(code int) string {
  msg, ok := codeMap[code]
  if !ok {
    msg = codeMap[1000]
  }
  return msg
}

type Response struct {
  Code int         `json:"code"`
  Msg  string      `json:"msg"`
  Data any         `json:"data"`
}

func respond(c *gin.Context, code int, msg string, data any) {
  c.JSON(http.StatusOK, Response{
    Code: code,
    Msg:  msg,
    Data: data,
  })
}

func OK(c *gin.Context, msg string, data any) {
  respond(c, 0, msg, data)
}
func OKWithData(c *gin.Context, data any) {
  OK(c, GetMsg(0), data)
}
func OKWithMsg(c *gin.Context, msg string) {
  OK(c, msg, gin.H{})
}

func Fail(c *gin.Context, code int, msg string, data any) {
  respond(c, code, msg, data)
}
func FailWithMsg(c *gin.Context, msg string) {
  Fail(c, 1001, msg, gin.H{})
}
func FailWithCode(c *gin.Context, code int) {
  msg := GetMsg(code)
  Fail(c, code, msg, gin.H{})
}

通过封装响应函数,可以在项目中统一管理响应格式,提升代码的可维护性和一致性,简洁方便。

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main

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

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

  r.GET("/json", func(c *gin.Context) {
    resp.OKWithMsg(c, "Hello, Gin!")
  })

  r.GET("/users", func(c *gin.Context) {
    resp.OKWithData(c, gin.H{
      "name": "秦始皇",
      "age":  22,
    })
  })

  r.POST("/users", func(c *gin.Context) {
    resp.FailWithMsg(c, "参数错误")
  })

  r.Run(":8080") // 启动服务器,监听端口8080
}

通过这种方式,可以更方便地管理和返回 JSON 响应,提升代码的可读性和可维护性。

本文由作者按照 CC BY 4.0 进行授权