Gin 框架 JSON 格式返回結果的使用方式

大家好,我是 frank。「Golang 語言開發棧」公衆號作者。

01  介紹

Gin 框架爲 JSON、XML 和 HTML 渲染提供了易用的 API。

本文我們主要介紹 JSON 的使用方式。

02  JSON

在 Go 項目開發中,當開發 HTTP API 時,我們通常提供 JSON 格式的返回結果。

Go 框架爲 JSON 渲染提供了易用的 API。

普通 JSON

示例代碼:

func main() {
 r := gin.Default()
 r.GET("/", func(c *gin.Context) {
  c.JSON(200, gin.H{
   "ping": "pong",
  })
 })
 err := r.Run()
 if err != nil {
  return
 }
}

輸出結果:

curl -s -X GET http://127.0.0.1:8080 | jq
{
  "ping""pong"
}

閱讀上面這段代碼,我們可以發現,使用 c.JSON() 方法,即可返回 JSON 格式的返回結果。

具有轉義的非 ASCII 字符的 ASCII-only JSON

示例代碼:

func main() {
 r := gin.Default()
 r.GET("/", func(c *gin.Context) {
  c.AsciiJSON(200, gin.H{
   "ping": "<b>pong</b>",
  })
 })
 err := r.Run()
 if err != nil {
  return
 }
}

輸出結果:

curl -s -X GET http://127.0.0.1:8080     
{"ping":"\u003cb\u003epong\u003c/b\u003e"}

閱讀上面這段代碼,我們使用 c.AsciiJSON() 方法,生成有轉義的非 ASCII 字符的 ASCII-only JSON。

跨域請求

示例代碼:

func main() {
 r := gin.Default()
 r.GET("/", func(c *gin.Context) {
  c.JSONP(200, gin.H{
   "ping": "pong",
  })
 })
 err := r.Run()
 if err != nil {
  return
 }
}

輸出結果:

curl -s -X GET http://127.0.0.1:8080\?callback\=x
x({"ping":"pong"});

閱讀上面這段代碼,我們使用 c.JSONP() 方法,使用 JSONP 向不同域的服務器請求數據。如果查詢參數存在回調,則將回調添加到響應體中。

PureJSON

示例代碼:

func main() {
 r := gin.Default()
 r.GET("/", func(c *gin.Context) {
  c.PureJSON(200, gin.H{
   "ping": "<b>pong</b>",
  })
 })
 err := r.Run()
 if err != nil {
  return
 }
}

輸出結果:

curl -s -X GET http://127.0.0.1:8080 | jq
{
  "ping""<b>pong</b>"
}

閱讀上面這段代碼,我們使用 c.PureJSON() 方法,輸出字面字符。

SecureJSON

示例代碼:

func main() {
 r := gin.Default()
 r.GET("/", func(c *gin.Context) {
  names := []string{"lena", "austin", "foo"}
  c.SecureJSON(200, names)
 })
 err := r.Run()
 if err != nil {
  return
 }
}

輸出結果:

curl -s -X GET http://127.0.0.1:8080     
while(1);["lena","austin","foo"]

閱讀上面這段代碼,我們使用 c.SecureJSON() 方法,防止 json 劫持。如果給定的結構是數組值,則默認預置 "while(1)," 到響應體。

我們也可以使用 r.SecureJsonPrefix(")]}',\n") 自定義 SecureJSON 前綴。

03  總結

本文我們介紹 Gin 框架爲 JSON 提供的幾種易於使用的 API。

gin.Hmap[string]interface{} 的一種快捷方式。

返回結果也可以使用一個結構體。

示例代碼:

func main() {
 r := gin.Default()
 r.GET("/", func(c *gin.Context) {
  var msg struct {
   Name    string `json:"user"`
   Message string
   Number  int
  }
  msg.Name = "Lena"
  msg.Message = "hey"
  msg.Number = 123
  c.JSON(http.StatusOK, msg)
 })
 err := r.Run()
 if err != nil {
  return
 }
}

輸出結果:

curl -s -X GET http://127.0.0.1:8080 | jq
{
  "user""Lena",
  "Message""hey",
  "Number"123
}

閱讀上面這段代碼,我們使用一個結構體,輸出 JSON 格式的返回結果。

注意 msg.Name 在 JSON 中變成了 "user",因爲我們在結構體中定義的 tag 爲 json:"user"

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/8JugNnvQpYSQ0B7uhFG2wA