我使用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?
我非常感谢任何帮助!
答案 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)
}
此外,除非在提交表单后进行某种处理,否则表单是无用的。所以相应地使用它。