github地址:

 

对 golang 原生的 http server 的路由功能进行增强

之前一直使用的 github.com/julienschmidt/httprouter http路由 但是对于这个路由器的一点非常不喜欢, 就是不能在 handler 函数中使用创建 handler 的类本身

所以自己重新写了一个, 可以在 handler 中获取 server 指针, 并且可以设置用户额外的参数:

type HandleFunc func(w http.ResponseWriter, r *http.Request, param CUrlParam, server CHttpServer, userdata interface{}) bool

用户参数可以在 NewRouterHandler(userdata interface{}, handle HandleFunc) 中指定 (userdata 参数)

另外这里存在一个返回值, 如果用户返回 nil, 内部将 io.WriteString(w, "interior error")

 

example:

package main

import (
	"fmt"
	"github.com/MwlLj/go-httpserver"
	"io"
	"net/http"
	"strings"
)

func HandleIndex(w http.ResponseWriter, r *http.Request, param httpserver.CUrlParam, server httpserver.CHttpServer, userdata interface{}) bool {
	s := userdata.(*CServer)
	s.CommonLogic()
	io.WriteString(w, "index")
	return true
}

func HandleHello(w http.ResponseWriter, r *http.Request, param httpserver.CUrlParam, server httpserver.CHttpServer, userdata interface{}) bool {
	io.WriteString(w, strings.Join([]string{"hello", *param.ByName("name")}, ":"))
	return true
}

func HandleHello2(w http.ResponseWriter, r *http.Request, param httpserver.CUrlParam, server httpserver.CHttpServer, userdata interface{}) bool {
	io.WriteString(w, strings.Join([]string{"hello", *param.ByName("name"), "age", *param.ByName("age")}, ":"))
	return true
}

func HandleError(w http.ResponseWriter, r *http.Request, param httpserver.CUrlParam, server httpserver.CHttpServer, userdata interface{}) bool {
	return false
}

type CServer struct {
	m_http httpserver.CHttpServer
}

func (this *CServer) CommonLogic() {
	fmt.Println("common logic")
}

func (this *CServer) Start() {
	// new
	this.m_http = httpserver.NewHttpServer()
	// resubscribe
	this.m_http.Subscribe("/", httpserver.GET, httpserver.NewRouterHandler(this, HandleIndex))
	this.m_http.Subscribe("/error", httpserver.GET, httpserver.NewRouterHandler(this, HandleError))
	this.m_http.Subscribe("/hello/:name", httpserver.GET, httpserver.NewRouterHandler(this, HandleHello))
	this.m_http.Subscribe("/hello/name/:name/age/:age", httpserver.GET, httpserver.NewRouterHandler(this, HandleHello2))
	http.ListenAndServe(":59000", this.m_http)
}

func main() {
	server := CServer{}
	server.Start()
}