Gin框架基本使用(1)| 青训营

70 阅读2分钟

Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API,性能要好得多,多亏了 httprouter,速度提高了 40 倍。 如果您需要性能和良好的生产力,您一定会喜欢 Gin。笔记参考官网,推荐大家去学习。

快速入门

安装

  1. 下载并安装gin

go get -u github.com/gin-gonic/gin

  1. 将gin引入到代码中

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

开始

示例:

package main

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

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

此时就完成了一个简单的后台程序。

常用示例

RESTful API

首先REST是一种软件架构风格,简单来说,就是用HTTP协议的不同请求代表不同的操作。

  • GET请求代表获取资源
  • POST请求代表新增资源
  • PUT请求代表更新或修改资源
  • DELETE请求代表删除资源

只要你的API程序遵守了这个规则,那么就可以成为RESTful API。
目前RESTful API在前后端分离结构中大量的使用。
Gin框架支持RESTful API开发

func main(){

    r:= gin.Default()
    
    r.GET("/request",func(c *gin.Context){
    
        c.JSON(200,gin.H{
            "message":"GET",
            
        })
    })
    
    r.POST("/request",func(c *gin.Context){
    
        c.JSON(200,gin.H{
            "message":"POST",
            
        })
    })
    
    r.PUT("/request",func(c *gin.Context){
    
        c.JSON(200,gin.H{
            "message":"PUT",
            
        })
    })
    
    r.DELETE("/request",func(c *gin.Context){
    
        c.JSON(200,gin.H{
            "message":"DELETE",
            
        })
    })



}

获取参数

获取querystring参数

也就是URL中?后面的参数

   
func main() {
	
	r := gin.Default()
        //请求如下:/user?username=小明&address=学校
	r.GET("/user", func(c *gin.Context) {
                //无值时,会给个默认值
		username := c.DefaultQuery("username", "小明")
		//username := c.Query("username") 
		address := c.Query("address")
		//输出json结果给调用方
		c.JSON(http.StatusOK, gin.H{
			"message":  "ok",
			"username": username,
			"address":  address,
		})
	})
	r.Run()
}

获取form表单参数

func main() {
	
	r := gin.Default()
	r.POST("/user", func(c *gin.Context) {
		// DefaultPostForm取不到值时会返回指定的默认值
		//username := c.DefaultPostForm("username", "小明")
		username := c.PostForm("username")
		address := c.PostForm("address")
		//输出json结果给调用方
		c.JSON(http.StatusOK, gin.H{
			"message":  "ok",
			"username": username,
			"address":  address,
		})
	})
	r.Run(":8080")
}

获取JSON参数

r.POST("/json", func(c *gin.Context) {
	
	b, _ := c.GetRawData()  // 从c.Request.Body读取请求数据
	// 定义map或结构体
	var m map[string]interface{}
	// 反序列化
	_ = json.Unmarshal(b, &m)

	c.JSON(http.StatusOK, m)
})

获取path参数

func main() {
	
	r := gin.Default()
	r.GET("/user/search/:username/:address", func(c *gin.Context) {
		username := c.Param("username")
		address := c.Param("address")
		//输出json结果给调用方
		c.JSON(http.StatusOK, gin.H{
			"message":  "ok",
			"username": username,
			"address":  address,
		})
	})

	r.Run(":8080")
}

参数绑定

// Binding from JSON
type Login struct {
	User     string `form:"user" json:"user" binding:"required"`
	Password string `form:"password" json:"password" binding:"required"`
}

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

	// 绑定JSON的示例 
	r.POST("/loginJSON", func(c *gin.Context) {
		var login Login

		if err := c.ShouldBind(&login); err == nil {
			fmt.Printf("login info:%#v\n", login)
			c.JSON(http.StatusOK, gin.H{
				"user":     login.User,
				"password": login.Password,
			})
		} else {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		}
	})

	// 绑定form表单示例 
	r.POST("/loginForm", func(c *gin.Context) {
		var login Login
		// ShouldBind()会根据请求的Content-Type自行选择绑定器
		if err := c.ShouldBind(&login); err == nil {
			c.JSON(http.StatusOK, gin.H{
				"user":     login.User,
				"password": login.Password,
			})
		} else {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		}
	})

	// 绑定QueryString示例 
	r.GET("/loginForm", func(c *gin.Context) {
		var login Login
		// ShouldBind()会根据请求的Content-Type自行选择绑定器
		if err := c.ShouldBind(&login); err == nil {
			c.JSON(http.StatusOK, gin.H{
				"user":     login.User,
				"password": login.Password,
			})
		} else {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		}
	})

	// Listen and serve on 0.0.0.0:8080
	router.Run(":8080")
}