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