前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gin用Request.Form获取不到参数的问题

gin用Request.Form获取不到参数的问题

作者头像
槽痞
发布2020-06-23 15:03:45
4.1K0
发布2020-06-23 15:03:45
举报

问题: 用Postman请求,ctx.Request.Form能获取到GET参数,却不能获取到POST参数

代码:

代码语言:javascript
复制
//测试获取参数
    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-dataparse.Form只能解析POST请求里面Content-Type:application/x-www-form-urlencoded的类型 在PHP里面对头部的请求没那么严格,而go则对这个有要求。

parseForm方法的注释里的解释如下:

2019-11-26T08:31:01.png
2019-11-26T08:31:01.png

如果是要获取请求类型为multipart/form-data的话,则需要通过ctx.Request.MultipartForm来获取。

不过,该方法也能获取到Content-Type:x-www-form-urlencode类型的请求参数

测试代码:

代码语言:javascript
复制
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
2019-11-26T08:48:59.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档