在此代码中,如果我注释了ParseForm()调用,则请求将按预期工作

package main

import (
    "fmt"
    "net/http"
    "net/url"
    "strings"
)

func main() {

    v := make(url.Values)
    v.Set("status", "yeah!")
    request, error := http.NewRequest("POST", "http://httpbin.org/post", strings.NewReader(v.Encode()))
    if error != nil {
        fmt.Println(error)
    }

    request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    err:=request.ParseForm()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(request.Form["status"])

    response, error := http.DefaultClient.Do(request)
    if error != nil {
        fmt.Println(error)
    } else {
        fmt.Println(response)
    }
}

但是,如果我调用ParseForm(),将清除主体并得到:
Post http://httpbin.org/post: http: Request.ContentLength=14 with Body length 0

就像 body 的长度已经耗尽了。如何访问表单值?我需要创建请求的签名。还有其他方法(除了直接从参数直接创建签名之外?)

最佳答案

使用 ParseForm 读取请求(未设置)。
对于简单的POST,您可以执行以下操作:

resp, err := http.PostForm("http://example.com/form", url.Values{"key": {"Value"}, "id": {"123"}})

http://golang.org/pkg/net/http/#Post
http://golang.org/pkg/net/http/#PostForm

关于go - 为什么request.ParseForm()耗尽了request.Body?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23773183/

10-12 06:21