Gin框架JSON渲染及參數獲取

字號+ 編輯: Snake 修訂: Snake 來源: 原创 2023-09-12 我要說兩句(0)

在Gin框架返回JSON格式的數據——JSON渲染

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)。

閲完此文,您的感想如何?
  • 有用

    0

  • 沒用

    0

  • 開心

    0

  • 憤怒

    0

  • 可憐

    0

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • GO語言GORM如何更新字段

  • gorm如何創建記錄與模型定義需要注意什麽

  • gorm一般查詢與高級查詢

  • GORM時間戳跟蹤及CURD(增刪改查)

我要說說
網上賓友點評