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(增刪改查)

我要說說
網上賓友點評