下面是用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
数据?
答案 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)
// 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参数。请注意, 发生冲突时,请求主体值将优先于 查询字符串参数。
FormValue
和PostFormValue
方法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表单发送到后端服务器的。
当用户将登录表单或注册数据从html提交回golang时,来自客户端的Content Type标头通常为application / x-www-form-urlencoded,我相信问题是什么,这些将是表单发布参数,这些参数使用r.FormValue(“ param1”)提取。
如果要从帖子正文中获取json,则可以抓取整个帖子正文并将原始json解组为结构,或者在从请求中提取数据后使用库来解析数据正文,内容类型标头application / json。
Content Type标头主要负责如何解析来自客户端的数据,我给出了2种不同内容类型的示例,但是还有更多内容。