一. 单控制器

  • 在Golang的net/http包下有ServeMux实现了Front设计模式的Front窗口,ServeMux负责接收请求并把请求分发给处理器(Handler)
  • http.ServeMux实现了Handler接口

    1. type Handler interface {
    2. ServeHTTP(ResponseWriter, *Request)
    3. }
    4. type ServeMux struct {
    5. mu sync.RWMutex
    6. m map[string]muxEntry
    7. hosts bool // whether any patterns contain hostnames
    8. }
    9. func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {
    10. if r.RequestURI == "*" {
    11. if r.ProtoAtLeast(1, 1) {
    12. w.Header().Set("Connection", "close")
    13. }
    14. w.WriteHeader(StatusBadRequest)
    15. return
    16. }
    17. h, _ := mux.Handler(r)
    18. h.ServeHTTP(w, r)
    19. }
  • 自定义结构体,实现Handler接口后,这个结构体就属于一个处理器,可以处理全部请求

    • 无论在浏览器中输入的资源地址是什么,都可以访问ServeHTTP ```go package main

import “fmt” import “net/http”

type MyHandler struct { }

func (mh MyHandler) ServeHTTP(res http.ResponseWriter, req http.Request) { fmt.Fprintln(res,”输出内容”) }

func main() { myhandler := MyHandler{} server := http.Server{ Addr: “127.0.0.1:8090”, Handler: &myhandler, } server.ListenAndServe() }

  1. <a name="ad1e0a7c"></a>
  2. # 二.多控制器
  3. - 在实际开发中大部分情况是不应该只有一个控制器的,不同的请求应该交给不同的处理单元.在Golang中支持两种多处理方式
  4. - 多个处理器(Handler)
  5. - 多个处理函数(HandleFunc)
  6. - 使用多处理器
  7. - 使用http.Handle把不同的URL绑定到不同的处理器
  8. - 在浏览器中输入http://localhost:8090/myhandler或http://localhost:8090/myother可以访问两个处理器方法.但是其他URl会出现404(资源未找到)页面
  9. ```go
  10. package main
  11. import "fmt"
  12. import "net/http"
  13. type MyHandler struct{}
  14. type MyOtherHandler struct{}
  15. func (mh *MyHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
  16. fmt.Fprintln(res, "第一个")
  17. }
  18. func (mh *MyOtherHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
  19. fmt.Fprintln(res, "第二个")
  20. }
  21. func main() {
  22. myhandler := MyHandler{}
  23. myother := MyOtherHandler{}
  24. server := http.Server{
  25. Addr: "localhost:8090",
  26. }
  27. http.Handle("/myhandler", &myhandler)
  28. http.Handle("/myother", &myother)
  29. server.ListenAndServe()
  30. }
  • 多函数方式要比多处理器方式简便.直接把资源路径与函数绑定 ```go package main

import “fmt” import “net/http”

//不需要定义结构体 //函数的参数需要按照ServeHTTP函数参数列表进行定义 func first(res http.ResponseWriter, req http.Request) { fmt.Fprintln(res, “第一个”) } func second(res http.ResponseWriter, req http.Request) { fmt.Fprintln(res, “第二个”) }

func main() { server := http.Server{ Addr: “localhost:8090”, } //注意此处使用HandleFunc函数 http.HandleFunc(“/first”, first) http.HandleFunc(“/second”, second) server.ListenAndServe() } ```