JSON渲染
func main(){
r := gin.Default()
r.GET("/someJSON",func(c *gin.Context){
c.JSON(http.StatusOK, gin.H{"meaage":"Hello world!"})
})
r.GET("/moreJSON",func(c *gin.Context){
var msg struct {
Name string `json:"user"`
Message string
Age int
}
msg.Name = "小王子"
msg.Message = "Hello world!"
msg.age = 18
c.JSON(http.StatusOK,msg) // JSON的序列化
})
r.Run(":8080")
}獲取參數
獲取querystring參數
querystring指的是URL中?後面攜帶的參數,例如:/user/search?username=小王子&address=沙河。
獲取請求querystring參數的方法如下:
func main(){
r := gin.Default()
r.GET("/user/search",func(c *gin.Context){
username := c.DefaultQuery("username","小王子")
address := c.Query("address")
c.JSON(http.StatucOK, gin.H{
"message":"ok",
"username":username,
"address":address,
})
})
r.Run()
}例子:
package main
import (
"github.com.gin-gonic/gin"
)
func main(){
r := gin.Default()
r.GET("/web", func(c *gin.Context){
name := c.Query("query") // 通過Query獲取請求中攜帶的querystring參數
age := c.Query("age")
c.JSON(http.StatusOk, gin.H{
"name":name,
"age":age,
})
})
r.Run(":9090")
}獲取form參數
請求的數據通過form表單來提交,例如向/user/search發送一個POST請求,獲取請求數據的方式如下:
func main (){
r := gin.Default()
r.POST("/user/search", func(c *gin.Context){
username := c.PostForm("username")
Address := c.PostForm("address")
c.JSON(http.StatusOK, gin.H{
"message":"ok",
"username":username,
"address":address,
})
})
r.Run(":8080")
}例子:main.go
package main
import (
"github.com/gin-gonic/gin"
)
func main (){
r := gin.Default()
r.LoadHTMLFiles("./login.html",""./index.html)
r.GET("/login",func(c *gin.Context){
c.HTML(http.StatusOK,"login.html",nil)
})
r.POST("/login",func(c *gin.Context){ // 匿名函數等待form表單裡的用戶名和密碼
username, ok := c.GetPostForm("username")
if !ok {
username = "somebody"
}
password, ok := c.GetPostForm("password")
if !ok {
password = "******"
}
c.HTML(http.StatusOK, "index.html", gin.H{
"Name": username,
"Password": password,
})
})
r.Run(":9090")
}// login.html
(注意:一次請求對應一次響應,一個請求可能對應相同的地址,當時對應的方法可能不同)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="/login" method="post" novalidate autocomplete="off">
<div>
<label for="username">username:</label>
<input type="text" name="username" id="username">
</div>
<div>
<label for="passwor">password:</label>
<input type="password" name-="password" id="password">
</div>
<div>
<input type="submit" value="登錄">
</div>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta cheset="UTF-8">
<title>index</title>
</head>
<body>
<h1>Hello, {{ .Name }}!</h1>
<p>你的密碼是:{{ .Password }}</p>
</body>
</html>獲取path(URL)參數
請求的參數通過URL路徑傳遞。例如:/user/search/小王子、沙河
獲取請求URL路徑中的參數的方式如下:
func main(){
r := gin.Default()
r.GET("/user/search/:username/:address", func(c *gin.Context){
username := c.Param("username")
adderss := c.Param("address")
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
})
r.Run(":8080")
}例子:main.go
package main
import (
"github.com/gin-ginic/gin"
)
func main(){
r := gin.Default()
r.GET("/user/:name/:age", func(c *gin.Context){
name := c.Param("name")
age := c.Param("age") // string類型
c.JSON(http.StatusOK, gin.H{
"name": name,
"age":age,
})
})
r.GET("/blog/:year/:month", func(c *gin.Context){
year := c.Param("year")
month := c.Param("month")
c.JSON(http.StatusOK, gin.H{
"year": year,
"month":month,
})
})
r.Run(":9090")
}參數綁定(前耑請求參數與後耑結構體進行綁定)
爲了更方便的獲取請求相關參數,提高開發效率。可以基於請求的Content-Type識別請求數據類型並利用反射機制自動提取請求中QueryString、form表單、JSON、XML等參數到結構體中。
示例代碼演示了:.ShouldBind()強大的功能,它能夠基於請求自動提取JSON、form表單和QueryString類型的數據,並把值綁定到指定的結構體對象。
// Bindding from JSON
type Login struct {
User string `form:"user" json:"user" binding:"rquired"`
Password string `form:"password" json:"password" binding:"rewuired"`
}
func main(){
router := gin.Default()
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()})
}
})
router.POST("loginForm", func(c *gin.Context){
var login Login
if err := c.ShouleBind(&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()})
}
})
router.GET("loginForm", func(c *gin.Context){
var login Login
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()})
}
})
router.Run(":8080")
}ShouldBind會按照下面的順序解析請求中的數據完成綁定:
1.如果是GET請求,只使用Form綁定引擎(query)。
2.如果是POST請求,首先檢查Content-Type是否爲JSON或XML,然後在使用Form(form-data)。