获取前端请求参数
1. 获取 URL (query)参数
querystring
指的是URL中?
后面携带的参数,例如:/user/search?username=zhangsan&address=北京
。 获取请求的query参数的方法如下:
URL 参数可以通过DefaultQuery() 和 Query() 两个参数获取
// urlQuery 获取 url中?后面携带的参数
func urlQueryHandle(ctx *gin.Context) {
// 如果指定的key 没有对应的值就使用默认值
username1 := ctx.DefaultQuery("username", "lisi")
// 根据key 获取值
username2 := ctx.Query("username")
address := ctx.Query("address")
// 返回JSON 字符串
ctx.JSON(http.StatusOK, gin.H{
"message": "ok",
"username1": username1,
"username2": username2,
"address": address,
})
}
func main() {
// 创建默认路由
r := gin.Default()
// 绑定路由规则
r.GET("/user/search", urlQueryHandle)
// 监听端口
r.Run(":9000")
}
? 后没有传值(使用默认值)
? 后携带值
2. 获取 Form参数
-
表单提交POST请求时,http常见的传输格式有四种
- application/json (json格式)
- text/plain (text格式)
- application/x-www-form-urlencode(表单默认提交格式)
- application./xml (xml格式)
- multipart/form-data( 文件上传)
-
可以通过 DefaultPostForm() 和 PostForm() 两个方法获取(默认解析的是 x-www-form-urlencode 和 form-data 格式的参数)
当前端请求的数据通过form表单提交时,例如向/user/search
发送一个POST请求,获取请求数据的方式如下:
// formParamsHandle 获取form表单提交数据
func formParamsHandle(ctx *gin.Context) {
// 获取不到值时就是用默认值
username1 := ctx.DefaultPostForm("username", "lisi")
username2 := ctx.PostForm("username")
address := ctx.PostForm("address")
// 以Json 字符串的形式返回
ctx.JSON(http.StatusOK, gin.H{
"message": "ok",
"username1": username1,
"username2": username2,
"address": address,
})
}
func main() {
// 创建路由
r := gin.Default()
// 绑定路由规则
r.POST("/user/search", formParamsHandle)
// 监听端口
r.Run(":9000")
}
表单中没有我们想要的值(使用默认值)
表单中有我们想要的值
3. 获取Json 参数
当前端请求的数据通过JSON提交时,例如向/user/search
发送一个POST请求,则获取请求参数的方式如下:
// paramsJsonHandle 获取json字符串相关的参数
func paramsJsonHandle(ctx *gin.Context) {
// 获取request.Body() 中的数据(这里没有进行错误处理)
// 返回的是字节数组
dataBytes, _ := ctx.GetRawData()
// 定义一个map
var m map[string]interface{}
// 反序列化 别忘了&
_ = json.Unmarshal(dataBytes, &m)
// 数据返回
ctx.JSON(http.StatusOK, m)
}
func main() {
// 创建路由
r := gin.Default()
// 绑定路由规则
r.POST("/user/search", paramsJsonHandle)
// 监听端口
r.Run(":9000")
}
ctx.GetRowData()
// GetRawData return stream data.
func (c *Context) GetRawData() ([]byte, error) {
return ioutil.ReadAll(c.Request.Body)
}
4. 获取Path参数(RestFul风格)
请求的参数通过URL路径传递,例如:/user/search/lisi/北京
。 获取请求URL路径中的参数的方式如下。
// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {
// 获取参数值
username := ctx.Param("username")
address := ctx.Param("address")
// 数据返回
ctx.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
}
func main() {
// 1. 创建路由
r := gin.Default()
// 2. 绑定路由规则
r.GET("/user/search/:username/:address", paramsPathHandle)
// 监听端口
r.Run(":9000")
}
通配符(会将通配符后面的路径都截取)
// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {
// 获取参数值
username := ctx.Param("username")
address := ctx.Param("address")
action := ctx.Param("action")
// 数据返回
ctx.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
"action": action,
})
}
func main() {
// 1. 创建路由
r := gin.Default()
// 2. 绑定路由规则
r.GET("/user/search/:username/:address/*action", paramsPathHandle)
// 监听端口
r.Run(":9000")
}
注意
: 多个通配符会报错
eg: /user/search/:username/:address/*action/*action2
5. 参数绑定
使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中
// 用户信息信息结构体
// 加上 binding:"required" 标签,说明该参数是必填的,如果不填就会报错
type UserInfo struct {
Username string `json:"username" form:"username" binding:"required"`
Address string `json:"address" form:"address" binding:"required"`
}
// 获取query参数
func queryHandle(ctx *gin.Context) {
var userInfo UserInfo
// 获取数据
err := ctx.ShouldBind(&userInfo)
if err == nil {
ctx.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": userInfo.Username,
"address": userInfo.Address,
})
} else {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}
func jsonHandle(ctx *gin.Context) {
var userInfo UserInfo
// 获取数据
err := ctx.ShouldBind(&userInfo)
if err == nil {
ctx.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": userInfo.Username,
"address": userInfo.Address,
})
} else {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}
func fromHandle(ctx *gin.Context) {
var userInfo UserInfo
// 获取数据
err := ctx.ShouldBind(&userInfo)
if err == nil {
ctx.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": userInfo.Username,
"address": userInfo.Address,
})
} else {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}
func main() {
// 创建路由
r := gin.Default()
// 绑定路由规则
r.GET("/user/query", queryHandle)
r.POST("/user/form", fromHandle)
r.POST("/user/json", jsonHandle)
// 监听端口
r.Run(":9000")
}
url query参数解析
form表单参数解析
json 数据解析