【Gin】gin json渲染,获取querystring参数,获取form参数,获取path参数,参数绑定

简介: 访问:http://localhost:9090/user?username=dahe&password=admin控制台输出:main.UserInfo{Username:“dahe”, Password:“admin”}ShouldBind会按照下面的顺序解析请求中的数据完成绑定:如果是 GET 请求,只使用 Form 绑定引擎(query)。如果是 POST 请求,首先检查 content-type 是否为 JSON 或 XML,然后再使用 Form(form-data)。



1.JSON渲染


package main
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
func main() {
  r := gin.Default()
  r.GET("/json", func(c *gin.Context) {
    // 方法:使用map序列化json数据
    data := map[string]interface{}{
      "name":    "dahe",
      "message": "json method",
      "age":     18,
    }
    // 返回状态码和json数据
    c.JSON(http.StatusOK, data)
  })
  r.Run(":9090") // 启动server
}


访问json地址,获取数据:



更简单的方法:使用gin.H


package main
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
func main() {
  r := gin.Default()
  r.GET("/json", func(c *gin.Context) {
  // 方法:使用gin.H
  data := gin.H{
    "name": "wangwei",
    "age":  18,
  }
  // 返回状态码和json数据
  c.JSON(http.StatusOK, data)
  })
  r.Run(":9090") // 启动server
}


使用结构体:


package main
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
func main() {
  r := gin.Default()
  type msg struct {
  Name    string
  Message string
  Age     int
  }
  r.GET("/json", func(c *gin.Context) {
  // 方法:使用结构体
  data := msg{
    "dahe",
    "你好世界!",
    22,
  }
  // 返回状态码和json数据
  c.JSON(http.StatusOK, data)
  })
  r.Run(":9090") // 启动server
}


附:灵活使用tag来自定义json数据属性名:🙌


type msg struct {
  Name    string `json:"name"`
  Message string
  Age     int
}


2.获取querystring参数


querystring指的是URL中?后面携带的参数,例如:/user/search?username=文杰&address=china。 获取请求的querystring参数的方法如下:


package main
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
func main() {
  r := gin.Default()
  r.GET("/query", func(c *gin.Context) {
    // 获取浏览器的发出请求携带的 query string 参数
    name := c.Query("name")
    c.JSON(http.StatusOK, gin.H{
      "name": name,
    })
  })
  r.Run(":9090") // 启动server
}


访问:http://127.0.0.1:9090/query?name=dahe

输出:{“name”:“dahe”}


设置没有接受搜索内容的默认参数值:


name := c.DefaultQuery("name", "无名氏")
// 如果没有传入参数,默认接受值:无名氏


访问:http://127.0.0.1:9090/query

输出:{“name”:“无名氏”}

带bool值的接受:


name, ok := c.GetQuery("name")
if !ok {
  // 没有传值,则设置默认的值
  name = "无名氏"
}


接受多个值的情况:


r.GET("/query", func(c *gin.Context) {
  // 获取浏览器的发出请求携带的 query string 参数
  name := c.Query("name")
  age := c.Query("age")
  c.JSON(http.StatusOK, gin.H{
  "name": name,
  "age":  age,
  })
})


访问:http://127.0.0.1:9090/query?name=dahe&age=18

输出:{“age”:“18”,“name”:“dahe”}


3.获取form参数


login.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<form action="/login/" method="post">
    账号:
    <input type="text" name="username" id="username">
    密码:
    <input type="password" name="password" id="password">
    <input type="submit" value="登录">
</form>
</body>
</html>


后端接受接口:


package main
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
func main() {
  r := gin.Default()
  r.LoadHTMLFiles("./login.html")
  // 登录模块
  r.GET("/login", func(c *gin.Context) {
    c.HTML(http.StatusOK, "login.html", nil)
  })
  // 接受form表单数据
  r.POST("/login", func(c *gin.Context) {
    // 获取form表单数据
    username := c.PostForm("username")
    password := c.PostForm("password")
    c.JSON(http.StatusOK, gin.H{
      "Name":     username,
      "Password": password,
    })
  })
  r.Run(":9090") // 启动server
}


使用DefaultPostForm来接受值


package main
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
func main() {
  r := gin.Default()
  r.LoadHTMLFiles("./login.html")
  // 登录模块
  r.GET("/login", func(c *gin.Context) {
    c.HTML(http.StatusOK, "login.html", nil)
  })
  // 接受form表单数据
  r.POST("/login", func(c *gin.Context) {
    // 获取form表单数据
    username := c.DefaultPostForm("username", "李华")
    password := c.DefaultPostForm("password", "admin")
    msg := c.DefaultPostForm("msg", "晚上好!")
    c.JSON(http.StatusOK, gin.H{
      "Name":     username,
      "Password": password,
      "msg":      msg,
    })
  })
  r.Run(":9090") // 启动server
}


由于form表单没有msg字段,所以msg采用默认的值

输出:{"Name":"admin","Password":"111111","msg":"晚上好!"}


4.gin path参数获取


请求的参数通过URL路径传递,例如:/user/search/dahe/用户1359。 获取请求URL路径中的参数的方式如下。


package main
import (
  "github.com/gin-gonic/gin"
  "net/http"
)
func main() {
  r := gin.Default()
  r.GET("/:name/:age", func(c *gin.Context) {
    name := c.Param("name")
    age := c.Param("age")
    c.JSON(http.StatusOK, gin.H{
      "name": name,
      "age":  age,
    })
  })
  r.Run(":9090") // 启动server
}


访问路径:http://localhost:9090/dahe/18

输出:{“age”:“18”,“name”:“dahe”}


5.参数绑定


为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString、form表单、JSON、XML等参数到结构体中


初步使用结构体


package main
import (
  "fmt"
  "github.com/gin-gonic/gin"
  "net/http"
)
// 用户结构体
type UserInfo struct {
  username string
  password string
}
func main() {
  r := gin.Default()
  r.GET("/", func(c *gin.Context) {
    username := c.Query("username")
    password := c.Query("password")
    u := UserInfo{
      username: username,
      password: password,
    }
    fmt.Printf("%#v\n", u)
    c.JSON(http.StatusOK, gin.H{
      "message": "ok",
    })
  })
  r.Run(":9090") // 启动server
}


访问:http://localhost:9090/?username=dahe&password=123

控制台输出:main.UserInfo{username:“dahe”, password:“123”}


.ShouldBind()参数绑定


.ShouldBind()强大的功能,它能够基于请求自动提取JSON、form表单和QueryString类型的数据,并把值绑定到指定的结构体对象。


package main
import (
  "fmt"
  "github.com/gin-gonic/gin"
  "net/http"
)
// 用户结构体
type UserInfo struct {
  Username string `form:"username" json:"username"`
  Password string `form:"password" json:"password"`
}
func main() {
  r := gin.Default()
  r.GET("/user", func(c *gin.Context) {
    var u UserInfo // 声明一个UserInfo类型的变量u
    err := c.ShouldBind(&u)
    if err != nil {
      c.JSON(http.StatusBadRequest, gin.H{
        "error": err.Error(),
      })
    } else {
      fmt.Printf("%#v\n", u)
      c.JSON(http.StatusOK, gin.H{
        "message": "ok",
      })
    }
  })
  r.Run(":9090") // 启动server
}


访问:http://localhost:9090/user?username=dahe&password=admin

控制台输出:main.UserInfo{Username:“dahe”, Password:“admin”}


ShouldBind会按照下面的顺序解析请求中的数据完成绑定:


如果是 GET 请求,只使用 Form 绑定引擎(query)。

如果是 POST 请求,首先检查 content-type 是否为 JSON 或 XML,然后再使用 Form(form-data)。


目录
相关文章
|
10月前
|
JSON JavaScript 数据格式
vue-element-admin表格json数据渲染,异常数据一行显示红色
vue-element-admin表格json数据渲染,异常数据一行显示红色
98 1
uniapp manifest.json 完整参数配置参考文档
uniapp manifest.json 完整参数配置参考文档
135 0
|
4月前
|
Web App开发 前端开发
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
210 0
|
4月前
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
261 1
|
29天前
|
JSON C语言 数据格式
Python导出隐马尔科夫模型参数到JSON文件C语言读取
Python导出隐马尔科夫模型参数到JSON文件C语言读取
17 1
|
4月前
|
JSON 前端开发 Java
SpringBoot之JSON参数,路径参数的详细解析
SpringBoot之JSON参数,路径参数的详细解析
59 0
|
11月前
|
JSON Java PHP
Spring Boot 一个接口同时支持 form 表单、form-data、json 优雅写法
网上很多代码都是千篇一律的 cvs,相信我只要你认真看完我写的这篇,你就可以完全掌握这个知识点,这篇文章不适合直接 cvs,一定要先理解。
|
4月前
|
JSON 数据格式
糊涂工具类(hutool)post请求设置body参数为json数据
糊涂工具类(hutool)post请求设置body参数为json数据
|
10月前
|
JSON JavaScript 前端开发
ztree+json,渲染树形菜单
ztree+json,渲染树形菜单
63 1
|
10月前
|
JSON 小程序 前端开发
微信小程序picker选择器渲染json数据
微信小程序picker选择器渲染json数据
59 0