Golang HTTP服务器,无法获取POST值

13
func login(rw http.ResponseWriter, req *http.Request) {
    req.ParseForm()

    if req.Method == "GET" {
        fmt.Fprintf(rw, "Error Method")
    } else {
        name := strings.TrimSpace(req.FormValue("userid"))
        fmt.Println("userid:", name)
        fmt.Println("pwd:", req.FormValue("pwd"))
        fmt.Fprintf(rw, "welcome back,%s", req.FormValue("userid"))
    }
}

我使用ASIhttprequst发送一个表单,就像这样。

[self setRequest:[ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://127.0.0.1:8080/login"]]];
[request setPostValue:@"userid" forKey:@"fdfs@jkjlf.cm"];
[request setPostValue:@"pwd" forKey:@"fdsfdsfdkskfjhds"];
[request setRequestMethod:@"POST"];

我使用req.FormValue("userid")获取到了一个空值。

发生了什么?如何修复?


可能只是一次无法确定的尝试 - 也许您混淆了PostValue和PostKey? - Alex Emelin
转储HTTP请求 - thwd
9个回答

10

这个怎么样?

req.ParseForm()
req.Form.Get(key)

2
是的,但您必须在其前面加上 req.ParseForm() - Matthew Ratzloff
不知道为什么你的答案没有被接受。直截了当。 - Mauricio

4
你已经使用req.PostFormValue而不是req.FormValue测试过了吗?


1
是的,我尝试使用PostFormValue而不是FormValue,但结果仍然相同。 - user1751912
1
你是否也尝试使用 req.ParseMultipartForm() 而不是 req.ParseForm() 进行测试了吗? - Neo

0
要从POST请求中提取值,您首先需要调用r.ParseForm()会解析URL中的原始查询并更新r.Form。

对于POST或PUT请求,它还将请求正文解析为表单,并将结果放入r.PostForm和r.Form中。 POST和PUT正文参数优先于r.Form中的URL查询字符串值。

现在,您的r.From是客户端提供的所有值的映射。要提取特定值,可以使用r.FormValue("<your param name>")r.Form.Get("<your param name>")

因此,基本上您将拥有以下内容:

r.ParseForm()
res := r.FormValue("<your param name>")

0
如果您进行multipart/form-data的POST请求,ParseForm方法可能无法正确解析请求体(这可能是一个bug)。所以,如果是这种情况,请使用ParseMultipartForm方法。
或者,您可以直接调用FormValue或PostFormValue方法,而不需要调用这些解析方法。

0

在调用ParseForm之前,我通过调用ParseMultipartForm找到了解决方法,这对我有效。


0

请确保通过某种方式读取req.Body io.Reader缓冲区以清除它

例如:ioutil.ReadAll如果Body缓冲区被清除,即使您ParseForm,它也将在FormValue上返回空值


0

我在使用ParseForm时遇到了类似的问题。最终我做了这样的事情:

type UserRequest struct {
  UserId  string `json:"userid"`
  Pwd     string `json:"pwd"`
}

func login(w http.ResponseWriter, r *http.Request) {
   var ur UserRequest
   decode := json.NewDecoder(r.Body)
   decoder.Decode(&ur)

   // Access data via struct
}

希望这能帮到你!


0
    // Form contains the parsed form data, including both the URL
    // field's query parameters and the POST or PUT form data.
    // **This field is only available after ParseForm is called.**
    // The HTTP client ignores Form and uses Body instead.
    Form url.Values

    // PostForm contains the parsed form data from POST, PATCH,
    // or PUT body parameters.
    //
    // **This field is only available after ParseForm is called.**
    // The HTTP client ignores PostForm and uses Body instead.
    PostForm url.Values

只有在调用ParseForm之后,才能使用此字段。 - Hao

-1

试试这个伙计。

希望它能像对我一样有效。

r.FormValue("userid")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接