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


目录
相关文章
|
JSON JavaScript 数据格式
vue-element-admin表格json数据渲染,异常数据一行显示红色
vue-element-admin表格json数据渲染,异常数据一行显示红色
255 1
|
Web App开发 前端开发
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
485 0
|
3月前
|
JSON API 数据处理
Swagger动态参数注解:使用@DynamicParameters实现JSON参数的灵活定义
总结起来,通过使用SpringFox提供给我们工具箱里面非常有力量但又不太显眼工具———即使面对复杂多变、非标准化数据格式也能轻松驾驭它们———从而大大增强我们系统与外界沟通交流能力同时也保证系统内部数据处理逻辑清晰明确易于维护升级.
262 10
|
3月前
|
JSON 中间件 Java
【GoGin】(3)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
我们在正常注册中间件时,会打断原有的运行流程,但是你可以在中间件函数内部添加Next()方法,这样可以让原有的运行流程继续执行,当原有的运行流程结束后再回来执行中间件内部的内容。​ c.Writer.WriteHeaderNow()还会写入文本流中。可以看到使用next后,正常执行流程中并没有获得到中间件设置的值。接口还提供了一个可以修改ContentType的方法。判断了传入的状态码是否符合正确的状态码,并返回。在内部封装时,只是标注了不同的render类型。再看一下其他返回的类型;
197 3
|
3月前
|
JSON Java Go
【GoGin】(2)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将,以方便后续业务逻辑的处理。
293 3
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
1140 1
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据
|
JSON API 数据格式
requests库中json参数与data参数使用方法的深入解析
选择 `data`或 `json`取决于你的具体需求,以及服务器端期望接收的数据格式。
967 2
|
JSON C语言 数据格式
Python导出隐马尔科夫模型参数到JSON文件C语言读取
Python导出隐马尔科夫模型参数到JSON文件C语言读取
185 1
|
JSON 数据格式
糊涂工具类(hutool)post请求设置body参数为json数据
糊涂工具类(hutool)post请求设置body参数为json数据

热门文章

最新文章