gin用Request.Form获取不到参数的问题
问题:
用Postman请求,ctx.Request.Form
能获取到GET参数,却不能获取到POST参数
代码:
//测试获取参数
u.GET("/test", func(ctx *gin.Context) {
if err := ctx.Request.ParseForm();err != nil{
log.Println("resolve param error:",err)
}
form := ctx.Request.Form
for index,value := range form{
log.Printf("%T",value)
log.Println("form index:",index,"--form value:",value[0])
}
})
u.POST("/test", func(ctx *gin.Context) {
if err := ctx.Request.ParseForm();err != nil{
log.Println("resolve param error:",err)
}
form := ctx.Request.Form
for index,value := range form{
log.Printf("%T",value)
log.Println("form index:",index,"--form value:",value[0])
}
})
后面发现是因为Content-Type
的设置不对的问题,用postman请求时使用的是Content-Type:multipart/form-data
。parse.Form
只能解析POST请求里面Content-Type:application/x-www-form-urlencoded
的类型
在PHP里面对头部的请求没那么严格,而go则对这个有要求。
parseForm方法的注释里的解释如下:
如果是要获取请求类型为multipart/form-data
的话,则需要通过ctx.Request.MultipartForm
来获取。
不过,该方法也能获取到Content-Type:x-www-form-urlencode
类型的请求参数。
测试代码:
u.POST("/test", func(ctx *gin.Context) {
if err := ctx.Request.ParseMultipartForm(2 << 10);err != nil{
log.Println("resolve param error:",err)
}
for k, v := range ctx.Request.Form {
fmt.Printf("k:%v\n", k)
fmt.Printf("v:%v\n", v)
}
ctx.JSON(200,"OK")
})
官方注释如下: