• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go语言http包Form解析之坑

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

最近正在用Go语言做一个项目,今天在用http包读取客户端发过来的POST数据时遇到了一点小麻烦,就下面这段代码,死活读不到数据:

if r.ContentLength > 0 {
    var body []byte
    nRead, err := r.Body.Read(body)   
    if err != nil {
        fmt.Println(err.Error())    
    }
}

返回的错误值是EOF。通过检查header信息,发现content-type是application/x-www-form-urlencoded。检查Request信息也发现ContentLength的值大于0。仔细过了一遍前面的代码,发现在刚开始处理请求的地方,为了输出http.Request的所有信息,调用下面这个函数来解析Form数据:

r.ParseForm()

试着把这句注释掉,可以读到数据了!

查看了ParseForm的源代码,发现它已经读取了Request Body里的数据:

    if r.Method == "POST" || r.Method == "PUT" {
    if r.Body == nil {
        return errors.New("missing form body")
        }
    ct := r.Header.Get("Content-Type")
    ct, _, err = mime.ParseMediaType(ct)
    switch {
    case ct == "application/x-www-form-urlencoded":
    var reader io.Reader = r.Body
        maxFormSize := int64(1<<63 - 1)
    if _, ok := r.Body.(*maxBytesReader); !ok {
        maxFormSize = int64(10 << 20) // 10 MB is a lot of text.
        reader = io.LimitReader(r.Body, maxFormSize+1)
    }
    b, e := ioutil.ReadAll(reader)
    if e != nil {
        if err == nil {
        err = e
        }
        break
    }
        

同时还要注意的有以下几个函数:

func (r *Request) ParseMultipartForm(maxMemory int64) error
func (r *Request) FormValue(key string) string
func (r *Request) FormFile(key string)

它们可能会直接或间接的调用ParseForm,同样会造成Body数据被读取。虽说浪费了一些时间,但好在及时跳出了这个坑,也希望这个教训能给大家一点帮助。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go泛型教程发布时间:2022-07-10
下一篇:
[转]自定义go的httpclient的DNS解析服务器地址,CustomDNSresolverforthedefaultHTTPc ...发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap