如何在go服务器中提取post参数

时间:2013-05-12 21:02:28

标签: http post get go

下面是用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/something数据?

6 个答案:

答案 0 :(得分:19)

像这样:

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)
}

答案 1 :(得分:2)

引自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

答案 2 :(得分:1)

要从帖子请求中提取值,您必须先调用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

答案 3 :(得分:0)

对于 POST PATCH PUT 请求:

首先我们调用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")

对于 POST GET PUT 等(对于所有请求):

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! Learn to Build Professional Web Applications With Golang。这本书可以回答您所有的问题!

答案 4 :(得分:0)

对于常规请求:

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

对于分段请求:

r.ParseForm()
r.ParseMultipartForm(32 << 20)
file, _, _ := r.FormFile("file")

答案 5 :(得分: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游乐场here

中运行代码

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

我现在想保留上面的链接,因为它为您提供了运行代码的好地方,并且我相信它能够在实际中看到它,这很有帮助,但让我解释一下您可能想要的一些典型情况后置参数。

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

  1. 当用户将登录表单或注册数据从html提交回golang时,来自客户端的Content Type标头通常为application / x-www-form-urlencoded,我相信问题是什么,这些将是表单发布参数,这些参数使用r.FormValue(“ param1”)提取。

  2. 如果要从帖子正文中获取json,则可以抓取整个帖子正文并将原始json解组为结构,或者在从请求中提取数据后使用库来解析数据正文,内容类型标头application / json。

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