【问题标题】:golang http server,can't get post valuegolang http服务器,无法获取post值
【发布时间】:2020-09-23 15:47:11
【问题描述】:
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?
  • 转储 HTTP 请求

标签: http go


【解决方案1】:

这个怎么样?

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

【讨论】:

  • 可以,但必须在前面加上req.ParseForm()
  • 不知道为什么你的回答没有被接受。直截了当
【解决方案2】:

您是否已经使用 req.PostFormValue 而不是 req.FormValue 对其进行了测试?

【讨论】:

  • 是的,我尝试用 PostFormValue 代替 FormValue,但结果还是一样。
  • 您是否也使用req.ParseMultipartForm() 而不是req.ParseForm() 对其进行了测试?
【解决方案3】:

我找到了在ParseForm 之前调用ParseMultipartForm 的解决方案,它对我有用。

【讨论】:

    【解决方案4】:

    如果您发出 multipart/form-data POST 请求,ParseForm 无法正确解析请求正文(这可能是一个错误)。因此,如果是这种情况,请使用 ParseMultipartForm。

    或者你可以直接调用FormValue或者PostFormValue而不调用这些解析方法。

    【讨论】:

      【解决方案5】:

      我在使用 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
      }
      

      希望有帮助!

      【讨论】:

        【解决方案6】:

        要从发布请求中提取值,您必须首先调用r.ParseForm()This 解析来自 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>")
        

        【讨论】:

          【解决方案7】:
              // 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 后可用。
          【解决方案8】:

          确保 req.Body io.Reader 缓冲区通过在某个级别读取它被清除

          例如:ioutil.ReadAll 如果正文缓冲区被清除,它会在 FormValue 上返回空值,即使你是 ParseForm

          【讨论】:

            【解决方案9】:

            试试这个朋友。

            希望它对我有用

            r.FormValue("userid")
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-10-18
              • 1970-01-01
              • 2019-01-29
              • 1970-01-01
              • 2013-07-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多