Files
build-web-application-with-…/4.1.md

81 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#4.1处理表单的输入
我们先来看一个表单递交的例子,我们有如下的表单内容
<form action="http://127.0.0.1:9090/login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="登陆">
</form>
上面递交表单到/login里面当用户输入信息之后点击登陆之后跳转到我们的login里面我们首先要判断这个是什么方式过来post还是get呢
http包里面有一个很简单的方式就可以获取我们在前面web的例子基础之上来看看怎么处理login怎么读取form数据
package main
import (
"fmt"
"net/http"
"strings"
"log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析参数,默认是不会解析的
fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
}
func login(w http.ResponseWriter, r *http.Request){
fmt.Println("method:",r.Method) //获取请求的方法
if r.Method=='GET'{
//输出登陆页面
}else{
//请求的是登陆数据,那么执行登陆的逻辑判断
}
}
func main() {
http.HandleFunc("/", sayhelloName) //设置访问的路由
http.HandleFunc("/login", login) //设置访问的路由
err := http.ListenAndServe(":9090", nil) //设置监听的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
上面的代码我们可以看出来获取请求方法的是`r.Method`这个是字符串类型返回GET, POST, PUT等method信息.
`r.Form`里面包含了所有请求的URL中query-string、POST的数据、PUT的数据所有当你在URL的query-string字段和POST冲突时会保存成一个slice里面存储了多个值Go官方说这个在接下来的版本里面会把POST、GET这些数据分离开来。
`r.Form`是一个url.Values类型里面存储的是对应的key=value信息下面展示了可以对form进行的一些操作
v := url.Values{}
v.Set("name", "Ava")
v.Add("friend", "Jess")
v.Add("friend", "Sarah")
v.Add("friend", "Zoe")
// v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe"
fmt.Println(v.Get("name"))
fmt.Println(v.Get("friend"))
fmt.Println(v["friend"])
默认情况下Handler里面是不会自动解析form的必须显示的调用`r.ParseForm()`,那么你才能对这个参数进行操作。
## links
* [目录](<preface.md>)
* 上一节: [表单](<4.md>)
* 下一节: [验证表单的输入](<4.2.md>)
## LastModified
* $Id$