问题:
用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方法的注释里的解释如下:
2019-11-26T08:31:01.png

如果是要获取请求类型为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")
    })

官方注释如下:

2019-11-26T08:48:59.png

标签: none

评论已关闭