17

下面是一个用 go 编写的服务器。

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
    fmt.Fprintf(w,"%s",r.Method)
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

如何提取POST发送到localhost:8080/somethingURL 的数据?

4

6 回答 6

34

像这样:

func handler(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()                     // Parses the request body
    x := r.Form.Get("parameter_name") // x will be "" if parameter is not set
    fmt.Println(x)
}
于 2013-05-12T22:27:29.607 回答
7

从文档中引用http.Request

// 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
于 2013-05-12T21:08:29.103 回答
3

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

于 2016-06-12T06:03:49.157 回答
2

对于POSTPATCHPUT请求:

首先我们调用r.ParseForm()它将 POST 请求正文中的任何数据添加到r.PostForm地图

err := r.ParseForm()
if err != nil {
    // in case of any error
    return
}

// Use the r.PostForm.Get() method to retrieve the relevant data fields
// from the r.PostForm map.
value := r.PostForm.Get("parameter_name")

对于POSTGETPUT等(适用于所有请求):

err := r.ParseForm()
if err != nil {
    // in case of any error
    return
}

// Use the r.Form.Get() method to retrieve the relevant data fields
// from the r.Form map.
value := r.Form.Get("parameter_name") // attention! r.Form, not r.PostForm 

Form方法_

相比之下,r.Form 映射为所有请求(不管它们的 HTTP 方法)填充,并包含来自任何请求正文和任何查询字符串参数的表单数据。因此,如果我们的表单被提交到 /snippet/create?foo=bar,我们也可以通过调用 r.Form.Get("foo") 来获取 foo 参数的值。请注意,如果发生冲突,请求正文值将优先于查询字符串参数。

FormValuePostFormValue方法_

net/http 包还提供了 r.FormValue() 和 r.PostFormValue() 方法。这些本质上是为您调用 r.ParseForm() 的快捷函数,然后分别从 r.Form 或 r.PostForm 获取适当的字段值。我建议避免使用这些快捷方式,因为它们会默默地忽略 r.ParseForm() 返回的任何错误。这并不理想——这意味着我们的应用程序可能会遇到错误并为用户失败,但没有反馈机制让他们知道。

所有示例均来自关于 Go 的最佳书籍 - Let's Go!学习使用 Golang 构建专业的 Web 应用程序。这本书可以回答你所有的问题!

于 2019-05-17T08:34:01.740 回答
0

对于正常请求:

r.ParseForm()
value := r.FormValue("value")

对于多部分请求:

r.ParseForm()
r.ParseMultipartForm(32 << 20)
file, _, _ := r.FormFile("file")
于 2019-05-17T09:13:54.723 回答
0
package main

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


func main() {
  // the forward slash at the end is important for path parameters:
  http.HandleFunc("/testendpoint/", testendpoint)
  err := http.ListenAndServe(":8888", nil)
  if err != nil {
    log.Println("ListenAndServe: ", err)
  }
}

func testendpoint(w http.ResponseWriter, r *http.Request) {
  // If you want a good line of code to get both query or form parameters
  // you can do the following:
  param1 := r.FormValue("param1")
  fmt.Fprintf( w, "Parameter1:  %s ", param1)

  //to get a path parameter using the standard library simply
  param2 := strings.Split(r.URL.Path, "/")

  // make sure you handle the lack of path parameters
  if len(param2) > 4 {
    fmt.Fprintf( w, " Parameter2:  %s", param2[5])
  }
}

您可以在此处的 aapi 操场上运行代码

将此添加到您的访问网址:/mypathparameeter?param1=myqueryparam

我现在想离开上面的链接,因为它为您提供了一个运行代码的好地方,而且我相信能够看到它的实际运行很有帮助,但是让我解释一些您可能需要 post 参数的典型情况.

开发人员有几种典型的方式将发布数据拉到后端服务器,通常在从请求中拉取文件或大量数据时会使用多部分表单数据,所以我看不出这有什么关系,至少在问题的背景下。他正在寻找帖子参数,这通常意味着表单帖子数据。通常表单发布参数以 Web 表单的形式发送到后端服务器。

  1. 当用户从 html 向 golang 提交登录表单或注册数据时,在这种情况下,来自客户端的 Content Type 标头通常是 application/x-www-form-urlencoded,我相信这就是问题所在,这些将是表单后参数,使用 r.FormValue("param1") 提取。

  2. 在从 post body 中获取 json 的情况下,您将获取整个 post body 并将原始 json 解组为一个结构,或者在从请求正文中提取数据后使用库来解析数据,Content Type 标头应用程序/json。

内容类型标头主要负责您将如何解析来自客户端的数据,我给出了 2 种不同内容类型的示例,但还有更多。

于 2019-11-07T08:51:12.360 回答