1.查询参数 query
func _query(context *gin.Context) {
//①context.Query
//获取数据,只能获取单个数据,http://127.0.0.1/query?user=RoLingG&user=temp
//因此只有单个数据:RoLingG,无temp
fmt.Println(context.Query("user"))
//②context.GetQuery
//不能以是否为空字符串判断有无传递数据,返回值一个是string值,一个是ok值
//只能获取单个数据,http://127.0.0.1/query?user=RoLingG&user=temp
//因此只有单个数据:RoLingG,无temp
fmt.Println(context.GetQuery("user"))
//③context.QueryArray
////能同时获取多个相同传入的数据,返回值是string类型的切片,http://127.0.0.1/query?user=RoLingG&user=temp
fmt.Println(context.QueryArray("user"))
//④context.QueryMap
//http://127.0.0.1/query?user[id]=1&user[name]=RoLingG
//运行结果为map[id:1 name:RoLingG],这里key是user,返回值是map[string]string
//访问路径包括问号后面的都是查询参数,不只有get是这样的
fmt.Println(context.QueryMap("user"))
//⑤context.DefaultQuery
//如果用户没传值过去,则用默认值
fmt.Println(context.DefaultQuery("age", "20"))
}
func main() {
router := gin.Default() //创建一个默认的路由,并赋予给router
router.GET("/query", _query) //访问路径:param/xxx/luoxiangshuoxingfa ←这个就叫访问路径
router.Run(":80")
}
2.动态参数 param
△之所以叫动态参数是因为其路径是可以被改变的
func _param(context *gin.Context) {
fmt.Println(context.Param("user_id"))
fmt.Println(context.Param("book_id"))
}
func main() {
router := gin.Default() //创建一个默认的路由,并赋予给router
router.GET("/param/:user_id", _param) //http://127.0.0.1/param/xxx
//返回:[GIN] 2023/05/27 - 15:20:58 | 200 | 0s | 127.0.0.1 | GET "/param/xxx"
//xxx能有什么符号都行,但是不能有路径符“/”
router.GET("/param/:user_id/:book_id", _param) //http://127.0.0.1/param/xxx/Single
//返回:[GIN] 2023/05/27 - 15:23:33 | 200 | 306µs | 127.0.0.1 | GET "/param/xxx/Single"
//*路径谁在前,谁就先被数据匹配。例如本例子user_id在book_id前,那么数据会先匹配给user_id*
router.Run(":80")
}
3.表单参数 postform
func _postform(context *gin.Context) {
fmt.Println(context.PostForm("name")) //这个不能接收文件是因为它的返回值是String类型的。
//能接收form-data以及x-www-form-urlencoded,同参数名的只会被传第一个
fmt.Println(context.PostFormArray("name")) //同参数名的会被一起传过去
fmt.Println(context.DefaultPostForm("age", "20")) //如果用户没有传值过去,则用默认值
mtforms, err := context.MultipartForm() //可以接收所用的form参数,包括文件
fmt.Println(mtforms, err)
}
func main() {
router := gin.Default() //创建一个默认的路由,并赋予给router
router.POST("/postform", _postform)
router.Run(":80")
}
4.原始参数 getrawdata(还有其他参数的解析,但不常用)
(1)未封装版
func _rawdata(context *gin.Context) {
//未封装的json解析函数
body, _ := context.GetRawData()
contentType := context.GetHeader("Content-Type") //form-data、x-www-form-urlencoded和json都分别对应了它们各自的type
fmt.Println(contentType) //打印header类型
switch contentType { //识别不同类型header做出不同逻辑
case "application/json": //只有为json类型数据post时才能接收到数据
//解析json结构体
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
var user User
err := json.Unmarshal(body, &user) //会返回以一个err判断是否解析成功
//按类型解析,例如上面的User结构体中Name的json tag从name变成了name1,而apipost过去的是name,则不能解析。
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(user) //打印解析后json结构体(只有解析的结构体数据会出现)
fmt.Println(string(body)) //打印原始传入的json结构体(有一些没有解析的结构体数据也会出现)
}
//fmt.Println(string(body)) //在x-www-form-urlencoded下是以url编码形式构成的
// form-data是以↓这种形式构成的(我不是很知道)
//Content-Disposition: form-data; name="name"
//
//RoLingG
//json形式 apipost里怎么写的就怎么传过来的
//{
// "name": "RoLingG",
// "age": "20"
//}
}
func main() {
router := gin.Default() //创建一个默认的路由,并赋予给router
router.POST("/rawdata", _rawdata)
router.Run(":80")
}
(2)封装版
func _rawdata(context *gin.Context) {
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Addr string `json:"addr"`
}
var user User
err := bindJson(context, &user)
if err != nil {
fmt.Println(err)
}
fmt.Println(user)
fmt.Println(context.GetRawData())
}
// 封装json结构体解析,any可以换为interface{} ←泛型(两个都是),用泛型是为了接收多类型的问题
func bindJson(context *gin.Context, obj any) (err error) {
body, _ := context.GetRawData()
contentType := context.GetHeader("Content-Type")
//form-data、x-www-form-urlencoded和json都分别对应了它们各自的type
fmt.Println(contentType)
switch contentType {
case "application/json": //只有为json类型数据post时才能接收到数据
//解析json结构体
err := json.Unmarshal(body, &obj) //会返回以一个err判断是否解析成功,按类型解析。
//例如上面的User结构体中Name的json tag从name变成了name1,而apipost过去的是name,则不能解析。
if err != nil {
fmt.Println(err.Error())
return err
}
}
return nil
}
func main() {
router := gin.Default() //创建一个默认的路由,并赋予给router
router.POST("/rawdata", _rawdata)
router.Run(":80")
}
评论(0)