从HTML <form> </form>解析输入

时间:2014-04-25 00:45:36

标签: forms go

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

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

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

因此,如果有一个带有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()
}

这是我的hello.html文件:

在体内:

<form action="" method="get">
    <input type="text" name="name" />
</form>

如何将hello.html连接到hello.go,以便Golang代码获取输入中的内容并在表单提交页面中返回hello,name?

我非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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)
}

应该是这样的:

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

修改:我应该注意到,在学习net/http

时,这一点让我感到沮丧

答案 1 :(得分:6)

您的表单输入名称名称是go程序提取的密钥。

<form action="" method="get">
    <input type="text" name="name" />
</form>

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

  

FormValue返回指定组件的第一个值   查询。 POST和PUT正文参数优先于URL查询   字符串值。 FormValue调用ParseMultipartForm和ParseForm if   必需并忽略这些函数返回的任何错误。如果关键   不存在,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)
}

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

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