• 3Gin的请求与响应


    一 请求

    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 .
    
  • 相关阅读:
    高级软件工程第一次作业
    《高级软件工程》团队第二次作业
    《高级软件工程》结对第二次作业
    《高级软件工程》团队第一次作业
    《高级软件工程》结对第一次作业
    《高级软件工程》第二次作业
    《高级软件工程》第一次作业
    冲刺NO.1
    冲刺No.4
    冲刺No.3
  • 原文地址:https://www.cnblogs.com/liuqingzheng/p/16124100.html
Copyright © 2020-2023  润新知