一.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")
}