简单Web Server实现
Go语言拥有强大的http库,利用它很快就可以实现一个简单的web server,以下是一个简单例子。
//main.go
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
//定义注册请求数据的结构体
type signUpReq struct {
Email string `json:"email"`
Password string `json:"password"`
ConfirmedPassword string `json:"confirmed_password"`
}
//定义响应数据的结构体
type commonResponse struct {
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
func home(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "这是主页")
}
func signUp(w http.ResponseWriter, r *http.Request) {
//创建新的结构体 用于存放client的请求数据
req := &signUpReq{}
//读取Body数据
body, err := io.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, "read body failed: %v", err)
//如果读取失败 立即返回
return
}
//对读取到的Body数据进行反序列化 存于req
err = json.Unmarshal(body, req)
if err != nil {
fmt.Fprintf(w, "deserialized failed: %v", err)
//如果解析失败 同样立即返回
return
}
//拿到反序列化req数据 就可以去做进一步处理 如进行真正注册、写入数据库等等
//这里只是做一下简单打印
fmt.Printf("Log-Req-%v", req)
//创建响应数据
resp := &commonResponse{
Msg: "Success",
Data: "Sign up successful",
}
//对响应数据进行序列化处理
respJson, _ := json.Marshal(resp)
//写入响应
fmt.Fprint(w, string(respJson))
}
func main() {
//注册路由 当命中路由后会执行后面的func
http.HandleFunc("/", home)
http.HandleFunc("/signup", signUp)
//启动服务监听
http.ListenAndServe(":8080", nil)
}
简单Web Server扩展
1. Server的抽象和实现
上述简例只存在一个Server服务,即一个8080监听端口。如果将”注册路由“和”启动监听“封装起来,表达一种逻辑上的抽象,它代表的是对某个端口的进行监听的实体,必要的时候,就可以开启多个Server,来监听多个端口。
新建一个server.go,定义一个Server接口,对”注册路由“和”启动监听“操作进行封装
//server.go
package main
import (
"net/http"
)
//Server 定义一个Server抽象接口
type Server interface {
//Route 用于注册路由
Route(pattern string, handlerFunc func(writer http.ResponseWriter, request *