1. 程式人生 > 其它 >3-Gin的請求與響應

3-Gin的請求與響應

一 請求

Gin的請求物件被封裝在gin.Context這個結構體指標中

1.1 c.Request結構體

fmt.Println(c.Request.Method) // 請求方式
fmt.Println(c.Request.Header)   // 請求頭
fmt.Println(c.Request.RemoteAddr) // 客戶端地址和埠
fmt.Println(c.Request.Host) // 服務端地址和埠

fmt.Println(c.Request.Cookies()) // cookie
fmt.Println(c.Request.UserAgent()) // 客戶端型別
fmt.Println(c.FullPath())       // 請求路徑,不帶?後的資料


fmt.Println(c.Request.Body) // 請求體,body體
body,_ := ioutil.ReadAll(c.Request.Body)
fmt.Println("---body--"+string(body))

二 響應

2.1 返回字串c.String

	r.GET("/test", func(c *gin.Context) {
		c.String(200,"成功")
	})

2.2 返回json格式

r.GET("/json", func(c *gin.Context) {
		// 1 方式一,直接返回map格式
		var m = map[string]interface{}{
			"name": "lqz",
			"age":  19,
		}
		c.JSON(200, m)
		// 2 方式二,藉助gin.H, gin.H 是 map[string]interface{}的縮寫
		c.JSON(200, gin.H{"name": "lqz", "age": 19})
		// 3 方式三:直接返回結構體,注意大寫,匯出欄位
		c.JSON(200, struct {
			Name string `json:"user"`
			Age  int
		}{"lqz", 19})
	})

2.3 返回json陣列

package main

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

func main() {
	router := gin.Default()
	router.GET("/json", func(c *gin.Context) {
		type Person struct {
			Name string `json:"name"`
			Age  int    `json:"age"`
		}
		var personList = []Person{{"lqz", 19}, {"彭于晏", 22}, {"林俊杰", 39}}
		c.IndentedJSON(200, personList)
	})
	router.Run(":8000")
}

2.4 返回xml格式

func main() {
	r := gin.Default()
	r.GET("/xml", func(c *gin.Context) {
		// 1 方式一:使用gin.H
		c.XML(200,gin.H{"name":"lqz","age":19})
		// 2 方式二:使用結構體
		type Person struct {
			Name string `xml:"user"`
			Age int
		}
		var lqz Person=Person{"lqz",19}
		c.XML(200,lqz)

	})

	r.Run(":8000")
}

2.5 返回YAML格式

	router.GET("/yaml", func(c *gin.Context) {
		c.YAML(200, gin.H{"name": "lqz", "age": 19})
	})

2.6 返回ProtoBuf格式

// protobuf格式,谷歌開發的高效儲存讀取的工具   
	router.GET("/someProtoBuf", func(c *gin.Context) {
		reps := []int64{1, 11, 111}
		t:=int32(999)
		// 定義資料
		label := "lqz_label"
		// protobuf 的具體定義寫在 testdata/protoexample 檔案中。
		data := &protoexample.Test{
			Label: &label,
			Type: &t,
			Reps:  reps,
		}
		// 請注意,資料在響應中變為二進位制資料
		// 將輸出被 protoexample.Test protobuf 序列化了的資料
		c.ProtoBuf(200, data)
	})

2.7 渲染模板

//1 在專案路徑下新建 templates資料夾,下新建index.tml或者index.html

func main() {
	r := gin.Default()
	// 要指定模板檔案的路徑
	r.LoadHTMLGlob("templates/*")
  // r.LoadHTMLFiles("./index.html") load單個頁面
	r.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK,"index.html",gin.H{
			"name":"lqz",
			"age":19,
		})

	})

	r.Run(":8000")
}

2.8 重定向

package main

import (
   "net/http"

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

func main() {
   r := gin.Default()
   r.GET("/index", func(c *gin.Context) {
      c.Redirect(http.StatusMovedPermanently, "http://www.liuqingzheng.top")
   })
   r.Run()
}

三使用 jsoniter編譯

jsoniter:https://github.com/json-iterator/go

Gin 使用 encoding/json 作為預設的 json 包,但是你可以在編譯中使用標籤將其修改為 jsoniter

$ go build -tags=jsoniter .