当前位置:   article > 正文

Go - 简单Web Server实现与扩展_go webserver

go webserver

简单Web Server实现

Go语言拥有强大的http库,利用它很快就可以实现一个简单的web server,以下是一个简单例子。

  1. //main.go
  2. package main
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "net/http"
  8. )
  9. //定义注册请求数据的结构体
  10. type signUpReq struct {
  11. Email string `json:"email"`
  12. Password string `json:"password"`
  13. ConfirmedPassword string `json:"confirmed_password"`
  14. }
  15. //定义响应数据的结构体
  16. type commonResponse struct {
  17. Msg string `json:"msg"`
  18. Data interface{} `json:"data"`
  19. }
  20. func home(w http.ResponseWriter, r *http.Request) {
  21. fmt.Fprintf(w, "这是主页")
  22. }
  23. func signUp(w http.ResponseWriter, r *http.Request) {
  24. //创建新的结构体 用于存放client的请求数据
  25. req := &signUpReq{}
  26. //读取Body数据
  27. body, err := io.ReadAll(r.Body)
  28. if err != nil {
  29. fmt.Fprintf(w, "read body failed: %v", err)
  30. //如果读取失败 立即返回
  31. return
  32. }
  33. //对读取到的Body数据进行反序列化 存于req
  34. err = json.Unmarshal(body, req)
  35. if err != nil {
  36. fmt.Fprintf(w, "deserialized failed: %v", err)
  37. //如果解析失败 同样立即返回
  38. return
  39. }
  40. //拿到反序列化req数据 就可以去做进一步处理 如进行真正注册、写入数据库等等
  41. //这里只是做一下简单打印
  42. fmt.Printf("Log-Req-%v", req)
  43. //创建响应数据
  44. resp := &commonResponse{
  45. Msg: "Success",
  46. Data: "Sign up successful",
  47. }
  48. //对响应数据进行序列化处理
  49. respJson, _ := json.Marshal(resp)
  50. //写入响应
  51. fmt.Fprint(w, string(respJson))
  52. }
  53. func main() {
  54. //注册路由 当命中路由后会执行后面的func
  55. http.HandleFunc("/", home)
  56. http.HandleFunc("/signup", signUp)
  57. //启动服务监听
  58. http.ListenAndServe(":8080", nil)
  59. }

简单Web Server扩展

1. Server的抽象和实现

上述简例只存在一个Server服务,即一个8080监听端口。如果将”注册路由“和”启动监听“封装起来,表达一种逻辑上的抽象,它代表的是对某个端口的进行监听的实体,必要的时候,就可以开启多个Server,来监听多个端口。

新建一个server.go,定义一个Server接口,对”注册路由“和”启动监听“操作进行封装

  1. //server.go
  2. package main
  3. import (
  4. "net/http"
  5. )
  6. //Server 定义一个Server抽象接口
  7. type Server interface {
  8. //Route 用于注册路由
  9. Route(pattern string, handlerFunc func(writer http.ResponseWriter, request *http.Request))
  10. //Start 用于启动监听
  11. Start(address string) error
  12. }
  13. type sdkHttpServer struct {
  14. name string
  15. }
  16. //接口的具体实现
  17. func (s *sdkHttpServer) Route(pattern string, handlerFunc func(writer http.ResponseWriter, request *http.Request)) {
  18. //实际还是调用原始的http接口
  19. http.HandleFunc(pat
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/681846
推荐阅读
相关标签
  

闽ICP备14008679号