这是我参与8月更文挑战的第4天,活动详情查看: 8月更文挑战
Web 应用程序是一种可以通过 Web 访问的应用程序,Web 程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。Web 应用对于身处互联网时代的我们来说太普遍。无论哪一种语言,只要它能够开发出与人类交互的软件,它就必然会支持 Web 应用开发。
本系列文章将会介绍 Go Web 的应用与实践。欢迎关注。
上一篇文章主要介绍了 Web 工作的几个概念以及处理请求的部分原理。本将会继续分析收发请求的其他过程,重点分析请求体的解析。
解析请求体
在绝大多数情况下, POST 请求都是通过 HTML 表单发送的,表单是一个包含表单元素的区域。表单元素(比如:文本域、下拉列表、单选框、复选框等等)是允许用户在表单中输入信息的元素。表单使用表单标签(
)定义。
表单是我们平常编写 Web 应用常用的工具,通过表单我们可以方便的让客户端和服务器进行数据的交互。如下代码所示是一个登录页表单:
<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
复制代码
我们在之前的例子上进行扩充,增加 /login
的路由,通过登录页表单提交登录信息,在服务端进行验证登录的结果。
import (
"fmt"
"html/template"
"log"
"net/http"
"strings"
)
func login(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //获取请求的方法
if r.Method == "GET" {
t, _ := template.ParseFiles("login.tpl")
log.Println(t.Execute(w, nil))
} else {
//请求的是登录数据,那么执行登录的逻辑判断
_ = r.ParseForm()
fmt.Println("username:", r.Form["username"])
fmt.Println("password:", r.Form["password"])
if pwd := r.Form.Get("password"); pwd == "123456" { // 验证密码是否正确
fmt.Fprintf(w, "欢迎登陆,Hello %s!", r.Form.Get("username")) //这个写入到w的是输出到客户端的
} else {
fmt.Fprintf(w, "密码错误,请重新输入!")
}
}
}
func sayHelloName(w http.ResponseWriter, r *http.Request) {
_ = r.ParseForm() //解析url传递的参数,对于POST则解析响应包的主体(request body)
//注意:如果没有调用ParseForm方法,下面无法获取表单的数据
fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
fmt.Println("path", r.URL.Path)
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello aoho!") //这个写入到w的是输出到客户端的
}
func main() {
http.HandleFunc("/", sayHelloName) //设置访问的路由
http.HandleFunc("/login", login)
err := http.ListenAndServe(":8080", nil) //设置监听的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
复制代码
如前所述,服务端实现时首先使用 ParseForm()
方法对请求进行表单的语法分析,然后访问表单的具体字段。
递交表单到服务器的 /login
,当用户输入信息点击登录之后,会跳转到服务器的路由 login,我们首先要判断是 POST 还是 GET 方式传递过来。Http 包里面有一个很简单的方式就可以获取,获取请求方法是通过 r.Method
来完成的,返回字符串类型的变量,包括 GET、POST 和 PUT 等方法。
当我们在浏览器里面打开 http://127.0.0.1:8080/login
的时候,出现如下界面:
login 函数中我们根据 r.Method
来判断是显示登录界面还是处理登录逻辑。当 GET 方式请求时显示登录界面,其他方式请求时则处理登录逻辑,如查询数据库、验证登录信息等。在上述的代码中,我们简单验证了密码字符串为 123456
即为登录成功,并返回用户名。否则,登录失败,并提示用户。结果如下面两张图所示:
输入用户名和正确的密码之后,提交表单返回的是对应的用户名。
当服务端的密码验证错误时,返回的是登录失败,服务我们设定的预期。
小结
本文主要解析了请求体的实现,通过登录页表单的示例,提交登录信息并在服务端进行验证登录的结果,从而介绍了解析请求体的过程。下面的文章将会继续介绍分析收发请求的其他过程。
阅读最新文章,关注公众号:aoho求索