Go设计简单的Web程序

接触了一段时间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来运行

image-20211227192140231

访问本地的8080端口

http://localhost:8080/hello

image-20211227192326553

发现访问成功了,但如果我们推出运行的终端,这个页面也会随之失效

image-20211227192434204

如果研究过别的语言就知道,做到启动服务器都比这复杂多了,当然也得益于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)
}

简单运行

image-20211227193515445

添加跳转

首先新建一个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函数

image-20211228094500166

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 ...

再次运行发现已经可以映射过来了

image-20211228094644082

如果报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)
重启服务器测试

GIF 2021-12-28 10-46-08

表单提交

有了表单界面再整个提交直接返回给浏览器相应的结果,首先在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)

再次测试

GIF 2021-12-28 10-51-27

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上上签i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值