本例中的服务端是自己定义的,在做服务端之前,需要了解服务端如何监听客户端的请求相关的知识。没有页面,我通过将页面的信息保存在一个常量中,go语言是支持的,然后就给常量赋值给服务端向客户端返回内容的对象里面,从而返回到浏览器上是一个界面的内容。
这就是定义的包含界面信息的常量:
const HTML = `<html>
<head>
<title>xxt-sms test </title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body>
<form action="/" method="post">
<input name="name" placeholder="请输入用户名" type="text"/>
<input type="submit" value="提交">
</form>
</body>
</html>`
将字节切片类型通过Md5函数返回为字符串类型:需要导入包:"crypto/md5"
func Md5(buf []byte) string {
hash := md5.New()
hash.Write(buf)
return fmt.Sprintf("%x", hash.Sum(nil))
}
服务端接收到客户端传递的请求,需要判断该请求的方式:
func indexHandle(w http.ResponseWriter, r *http.Request) {
m := r.Method
//判断请求的方式
if m == "GET" {
sendIndexPage(w, r)
} else {
parseIndexPost(w, r)
}
}
通过r.Method得到客户端提交的请求。
get请求来处理页面:
func sendIndexPage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, HTML) //这个写入到w的是输出到客户端的
}
处理post请求,需要得到浏览器上表单中的某个控件的值。注意:从表单上得到的某个控件的值,go语言默认为是[]string即字符串切片类型。
func parseIndexPost(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析参数,默认是不会解析的,如果没有写这句话的话,就无法得到请求的表单上面的数据
username := r.Form["name"] //从表单上得到字符串类型的变量的值是字符串数组,需要通过遍历得到字符串,字符串转换成字节数组的方式:[]byte(str)
length := len(username)
var str string
for i := 0; i < length; i++ {
str = str + username[i]
}
name := []byte(str)
message := Md5(name)
fmt.Fprintf(w, message) //将结果返回到客户端
}
搭建一个简单的web服务器:
http.HandleFunc("/", indexHandle) //设置访问的路由
err := http.ListenAndServe(":9091", nil) //设置监听的端口
if err != nil {
log.Fatal("listenAndServe:", err)
}
完整代码请见文件httpmd5.go。