# 路由的简单实现

# Server改动

使用map进行路由的映射,则Server端需要加上mapHandler的实现

// SDKHTTPServer 必须实现Server接口才能不报错
var _ Server = &SDKHTTPServer{}

type SDKHTTPServer struct {
	Name string
	handler *HandlerBaseOnMap
}
1
2
3
4
5
6
7

路由的方法也需要修改,在注册函数的时候先不调用httpHandleFunc的方法,而是使用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

启动函数也需要对应需改

func (S *SDKHTTPServer) Start(port string) error {
	http.Handle("/", S.handler) // 真正的注册路由
	return http.ListenAndServe(port, nil)
}
1
2
3
4

# 新增Handler

handler.go中使用map实现路由的简单映射,使用单独的模块实现,使用http.Handle()方式注册路由,所以需要实现http.Handler接口

type Handler interface {
	ServeHTTP(ResponseWriter, *Request)
}
1
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
上次更新: 10/9/2023,