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

这是我参与8月更文挑战的第4天,活动详情查看: 8月更文挑战html

Web 应用程序是一种能够经过 Web 访问的应用程序,Web 程序的最大好处是用户很容易访问应用程序,用户只须要有浏览器便可,不须要再安装其余软件。Web 应用对于身处互联网时代的咱们来讲太广泛。不管哪种语言,只要它可以开发出与人类交互的软件,它就必然会支持 Web 应用开发。数据库

本系列文章将会介绍 Go Web 的应用与实践。欢迎关注。浏览器

上一篇文章主要介绍了 Web 工做的几个概念以及处理请求的部分原理。本将会继续分析收发请求的其余过程,重点分析请求体的解析。服务器

解析请求体

在绝大多数状况下, POST 请求都是经过 HTML 表单发送的,表单是一个包含表单元素的区域。表单元素(好比:文本域、下拉列表、单选框、复选框等等)是容许用户在表单中输入信息的元素。表单使用表单标签(markdown

)定义。

表单是咱们日常编写 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() 方法对请求进行表单的语法分析,而后访问表单的具体字段。post

递交表单到服务器的 /login,当用户输入信息点击登陆以后,会跳转到服务器的路由 login,咱们首先要判断是 POST 仍是 GET 方式传递过来。Http 包里面有一个很简单的方式就能够获取,获取请求方法是经过 r.Method 来完成的,返回字符串类型的变量,包括 GET、POST 和 PUT 等方法。url

当咱们在浏览器里面打开 http://127.0.0.1:8080/login 的时候,出现以下界面:spa

image.png

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

login-success.jpg

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

image.png

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

小结

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

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

相关文章
相关标签/搜索