# 路由的简单实现
# Server改动
使用map进行路由的映射,则Server端需要加上mapHandler的实现
// SDKHTTPServer 必须实现Server接口才能不报错
var _ Server = &SDKHTTPServer{}
type SDKHTTPServer struct {
Name string
handler *HandlerBaseOnMap
}
1
2
3
4
5
6
7
2
3
4
5
6
7
路由的方法也需要修改,在注册函数的时候先不调用http的HandleFunc的方法,而是使用map记录handler,在启动的时候,再真正的注册
func (S *SDKHTTPServer) Route(
method string,
pattern string,
handleFunc func(*Context)) {
S.handler.handlers[S.handler.key(method, pattern)] = handleFunc
}
1
2
3
4
5
6
2
3
4
5
6
启动函数也需要对应需改
func (S *SDKHTTPServer) Start(port string) error {
http.Handle("/", S.handler) // 真正的注册路由
return http.ListenAndServe(port, nil)
}
1
2
3
4
2
3
4
# 新增Handler
handler.go中使用map实现路由的简单映射,使用单独的模块实现,使用http.Handle()方式注册路由,所以需要实现http.Handler接口
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
1
2
3
2
3
handler.go的具体实现:
package main
import (
"fmt"
"net/http"
)
type HandlerBaseOnMap struct {
handlers map[string]func(*Context)
}
func (h *HandlerBaseOnMap) ServeHTTP(
writer http.ResponseWriter,
request *http.Request) {
key := h.key(request.Method, request.URL.Path)
if handler, ok := h.handlers[key]; ok {
handler(NewContext(writer, request))
} else {
writer.WriteHeader(http.StatusNotFound)
_, _ = writer.Write([]byte("Not Found"))
}
}
func(h *HandlerBaseOnMap) key(method, pattern string) string {
return fmt.Sprintf("%s#%s", method, pattern)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26