gin框架学习笔记

一.gin返回json格式的数据

方法1:使用map

//方法1
	r:=gin.Default()
	r.GET("/json", func(c *gin.Context) {
		data:=map[string]interface{}{
			"name":"小王子",
			"message":"hello",
			"age":18,
		}
		c.JSON(http.StatusOK,data)
	})

这种方法有简单的写法

gin.H 是map[string]interface{}的缩写,map里面可以不用大写,但是结构体里面必须要大写

r:=gin.Default()
	r.GET("/json", func(c *gin.Context) {
		data:=gin.H{"name":"xiaowangzi","message":"hello","age":18}
		c.JSON(http.StatusOK,data)
	})

这俩种是等价的,我们来一种不等价的写法:

方法二:利用结构体

func main() {
	r := gin.Default()
	r.GET("/moreXML", func(c *gin.Context) {
		// 方法二:使用结构体
		type MessageRecord struct {
			Name    string
			Message string
			Age     int
		}
		var msg MessageRecord
		msg.Name = "小王子"
		msg.Message = "Hello world!"
		msg.Age = 18
		c.XML(http.StatusOK, msg)
	})
	r.Run(":8080")
}

有个坑!!如果我们把Name换成name,那么就要错。

这里c.json本质上是json的序列化,默认的go语言json模块是通过反射做一个数据的序列化,如果我们改成name,那么表示不可导出!!!!

那么我们就是需要小写的怎么办?

给结构体打tag,灵活使用tag来做定制化操作

type MessageRecord struct {
			Name    string `json :"name"`
			Message string 
			Age     int
		}

二.获取querystring参数,一般用在get请求的时候

获取querystring的三种方法,在注释里面

package lesson

import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func main(){
	//方法1
	r:=gin.Default()
	r.GET("/web", func(c *gin.Context) {
		//获取浏览器那边发过来的请求携带的query String参数

		//通过query后去请求中携带的querystring数据,这里name的值就是query的值
		//name:=c.Query("query")
//----------------------------------------------------------------------
		//DefaultQuery,如果输入的是不是query那么默认是somebody
		//比如:9090/web?xxx=123,没有接收到query的值,这里我们默认query的值是somebody
		//name:=c.DefaultQuery("query","somebody")

//----------------------------------------------------------------------
		//GetQuery会帮你判断,没取到返回("",false),取到了返回(值,true)
		name,err:=c.GetQuery("query")
		if !err{
			//如果取不到
			name="somebody"
		}
		 c.JSON(http.StatusOK,gin.H{
		 	"name":name,
		 })
	})
	r.Run(":9090")
}

GET请求URL?后面的事querystring参数,key=value格式,多个key-val之间用&连接

/web?query=xxx&age=18


三.获取from表单提交的参数,用于登陆,注册的时候,用于post请求

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

四.获取URL路径(PATH)参数

用param函数拿到

func main() {
	//Default返回一个默认的路由引擎
	r := gin.Default()
	r.GET("/user/search/:username/:address", func(c *gin.Context) {
		username := c.Param("username")
		address := c.Param("address")
		//返回的都是字符串类型,注意url匹配可能会冲突
		//输出json结果给调用方
		c.JSON(http.StatusOK, gin.H{
			"message":  "ok",
			"username": username,
			"address":  address,
		})
	})

	r.Run(":8080")
}

五.gin参数绑定——ShouldBind

在这里插入图片描述

from格式的时候按照username去找
json格式的时候按照password去找

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

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

	// 绑定JSON的示例 ({"user": "q1mi", "password": "123456"})
	router.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表单示例 (user=q1mi&password=123456)
	router.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示例 (/loginQuery?user=q1mi&password=123456)
	router.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")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值