在Golang中解析来自HTML <form>的输入

gra*_*nja 6 forms go

我使用Goji框架运行了一些东西:

package main

import (
        "fmt"
        "net/http"

        "github.com/zenazn/goji"
        "github.com/zenazn/goji/web"
)

func hello(c web.C, w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, %s!", c.URLParams["name"])
}

func main() {
        goji.Get("/hello/:name", hello)
        goji.Serve()
}
Run Code Online (Sandbox Code Playgroud)

我希望有人可以帮我做的是弄清楚提交HTML表单时如何将该数据发送到Golang代码.

因此,如果有一个带有name属性的输入字段,并且name的值是name,并且用户在那里键入一个名称并提交,那么在表单提交页面上,Golang代码将打印hello,name.

这是我能想到的:

package main

import(
    "fmt"
    "net/http"

    "github.com/zenazn/goji"
    "github.com/zenazn/goji/web"
)

func hello(c web.C, w http.ResponseWriter, r *http.Request){
    name := r.PostFormValue("name")
    fmt.Fprintf(w, "Hello, %s!", name)
}

func main(){
    goji.Handle("/hello/", hello)
    goji.Serve()
}
Run Code Online (Sandbox Code Playgroud)

这是我的hello.html文件:

在身体里:

<form action="" method="get">
    <input type="text" name="name" />
</form>
Run Code Online (Sandbox Code Playgroud)

如何连接hello.htmlhello.goGolang代码获取输入中的内容并在表单提交页面中返回hello,name?

我非常感谢任何帮助!

yum*_*kas 17

要读取html表单值,您必须先调用r.ParseForm().您可以获取表单值.

所以这段代码:

func hello(c web.C, w http.ResponseWriter, r *http.Request){
    name := r.PostFormValue("name")
    fmt.Fprintf(w, "Hello, %s!", name)
}
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

func hello(c web.C, w http.ResponseWriter, r *http.Request){

    //Call to ParseForm makes form fields available.
    err := r.ParseForm()
    if err != nil {
        // Handle error here via logging and then return            
    }

    name := r.PostFormValue("name")
    fmt.Fprintf(w, "Hello, %s!", name)
}
Run Code Online (Sandbox Code Playgroud)

编辑:我应该注意到,这是在学习net/http包时绊倒我的一点

  • 如果你使用`FormValue`或`PostFormValue`,你实际上不必调用`ParseForm`:"如果需要,PostFormValue会调用ParseMultipartForm和ParseForm,并忽略这些函数返回的任何错误." https://golang.org/pkg/net/http/#Request.PostFormValue (6认同)

Sou*_*gat 6

您的表单输入名称, 名称是go程序提取的关键.

<form action="" method="get">
    <input type="text" name="name" />
</form>
Run Code Online (Sandbox Code Playgroud)

您可以使用FormValue https://golang.org/pkg/net/http/#Request.FormValue

FormValue返回查询的命名组件的第一个值.POST和PUT正文参数优先于URL查询字符串值.如有必要,FormValue会调用ParseMultipartForm和ParseForm,并忽略这些函数返回的任何错误.如果key不存在,FormValue将返回空字符串.要访问同一个键的多个值,请调用ParseForm,然后直接检查Request.Form.

func hello(c web.C, w http.ResponseWriter, r *http.Request){
    name := r.FormValue("name")
    fmt.Fprintf(w, "Hello, %s!", name)
}
Run Code Online (Sandbox Code Playgroud)

如果FormFile不起作用,最好使用ParseMultiForm https://golang.org/pkg/net/http/#Request.ParseMultipartForm

您可以使用ParseMultipartForm

ParseMultipartForm将请求主体解析为multipart/form-data.解析整个请求体,并将其文件部分的总maxMemory字节存储在内存中,其余部分存储在临时文件的磁盘上.如有必要,ParseMultipartForm会调用ParseForm.在调用ParseMultipartForm之后,后续调用无效

func hello(c web.C, w http.ResponseWriter, r *http.Request){
    name := r.FormValue("name")
    r.ParseMultipartForm(32 << 20)
    fmt.Fprintf(w, "Hello, %s!", name)
}
Run Code Online (Sandbox Code Playgroud)

此外,除非在提交表单后进行某种处理,否则表单是无用的.所以相应地使用它.