接触了一段时间Go语言,今天用Go来制作一个简单的Web应用程序
对于Web服务器的结构相信大家都比较了解了,在浏览器中输入一个URL本质上是发送一个对Web页面的请求,该请求被发送到服务器,而服务端的工作就是根据请求,将对应的页面作为响应返回给浏览器(客户端)。
不同于其他语言,处理来自浏览器的请求需要大量的工作,Go只需要使用net/http的包来处理对应的请求,这个包中甚至还包括一个小型的Web服务器,所以可以处理请求,我们来编写代码测试一下。
处理单个请求
web_demo.go
package main
import (
"log"
"net/http"
)
//writer用于更新发送到浏览器的响应的值
func viewHandler(writer http.ResponseWriter, request *http.Request) {
message := []byte("Hello, web!")
_, err := writer.Write(message)
if err != nil {
log.Fatal(err)
}
}
func main(){
//如果收到的是hello请求,则调用viewHandler函数来处理返回
http.HandleFunc("/hello", viewHandler)
//监听本地的8080端口
err := http.ListenAndServe("localhost:8080", nil)
log.Fatal(err)
}
我们简单的运行一下
这里我用GoLand直接运行的,也可以直接在终端使用go run ×××.go来运行
访问本地的8080端口
http://localhost:8080/hello
发现访问成功了,但如果我们推出运行的终端,这个页面也会随之失效
如果研究过别的语言就知道,做到启动服务器都比这复杂多了,当然也得益于go的net/http包中含有小型服务器。
处理多个请求
web_demo2.go
func write(writer http.ResponseWriter, message string) {
_, err := writer.Write([]byte(message))
if err != nil {
log.Fatal(err)
}
}
func englishHandler(writer http.ResponseWriter, request *http.Request) {
write(writer, "Hello, web!")
}
func frenchHandler(writer http.ResponseWriter, request *http.Request) {
write(writer, "Salut, web!")
}
func hindiHandler(writer http.ResponseWriter, request *http.Request) {
write(writer, "Hello, web!")
}
func main(){
http.HandleFunc("/hello", englishHandler)
http.HandleFunc("/salut", frenchHandler)
http.HandleFunc("/namaste", hindiHandler)
err := http.ListenAndServe("localhost:8080", nil)
log.Fatal(err)
}
简单运行
添加跳转
首先新建一个guestbook.go,对比之前细微改动
guestbook.go
package main
import (
"log"
"net/http"
)
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
func viewHandler1(writer http.ResponseWriter, request *http.Request) {
placeholder := []byte("signature list goes here")
_, err := writer.Write(placeholder)
check(err)
}
func main(){
//处理网页通用接口
http.HandleFunc("/guestbook", viewHandler1)
err := http.ListenAndServe("localhost:8080", nil)
log.Fatal(err)
}
然后我们做一个静态界面备用
view.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Guestbook</title>
</head>
<body>
<div>
X total signatures -
<a href="/guestbook/new">Add Your Signature</a>
</div>
<div>
<p>Signatures</p>
<p>go</p>
<p>here</p>
</div>
</body>
</html>
运行服务器以后发现现在的8080还是不能映射到view页面的,我们需要简单改动一下viewHandler函数
guestbook.go
// Code ...
import (
"html/template"
"log"
"net/http"
)
func check(err error) {
// Code ...
}
func viewHandler1(writer http.ResponseWriter, request *http.Request) {
html, err := template.ParseFiles("view.html")
check(err)
err = html.Execute(writer, nil)
//placeholder := []byte("signature list goes here")
//_, err := writer.Write(placeholder)
check(err)
}
// Code ...
再次运行发现已经可以映射过来了
如果报404的,请确保view.html在你的项目目录中
我们让这个Add Your Signature的超链接跳转生效
在guestbook.go中添加一个函数
newHandler
func newHandler(writer http.ResponseWriter, request *http.Request) {
html, err := template.ParseFiles("new.html")
check(err)
err = html.Execute(writer, nil)
check(err)
}
在main中添加调用
http.HandleFunc("/guestbook/new", newHandler)
重启服务器测试
表单提交
有了表单界面再整个提交直接返回给浏览器相应的结果,首先在guestbook.go中添加一个新的createHandle函数
guestbook.go
func createHandler(writer http.ResponseWriter, request *http.Request) {
signature := request.FormValue("signature")
_, err := writer.Write([]byte(signature))
check(err)
}
在main中添加
http.HandleFunc("/guestbook/create", createHandler)
再次测试