Go Web 入门与实战系列:解析请求体

这是我参与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 的时候,出现如下界面:

image.png

login 函数中我们根据 r.Method 来判断是显示登录界面还是处理登录逻辑。当 GET 方式请求时显示登录界面,其他方式请求时则处理登录逻辑,如查询数据库、验证登录信息等。在上述的代码中,我们简单验证了密码字符串为 123456 即为登录成功,并返回用户名。否则,登录失败,并提示用户。结果如下面两张图所示:

login-success.jpg

输入用户名和正确的密码之后,提交表单返回的是对应的用户名。

image.png

当服务端的密码验证错误时,返回的是登录失败,服务我们设定的预期。

小结

本文主要解析了请求体的实现,通过登录页表单的示例,提交登录信息并在服务端进行验证登录的结果,从而介绍了解析请求体的过程。下面的文章将会继续介绍分析收发请求的其他过程。

阅读最新文章,关注公众号:aoho求索

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享