参照Gin的框架, 简单的模仿, 对现有的http做了一些封装
package main
import (
" encoding /json"
"net/http"
)
type HandlerFunc func(ctx *Context)
type Engine struct {
Router map[string]HandlerFunc
}
type H map[string]interface{}
func New() *Engine {
return &Engine{
router: make(map[string]HandlerFunc),
}
}
type Context struct {
writer http.ResponseWriter
Request *http.Request
Method string
}
func (ctx *Context) Status(statusCode int) {
ctx.writer.WriteHeader(statusCode)
}
func (ctx *Context) SetHeader(key, value string) {
ctx.writer.Header().Set(key, value)
}
func (ctx *Context) Query(param string) string {
return ctx.request.URL.Query().Get(param)
}
func (ctx *Context) PostForm(param string) string {
return ctx.request.PostForm.Get(param)
}
func (ctx *Context) JSON(statusCode int, data interface{}) {
ctx.writer.WriteHeader(statusCode)
ctx.writer.Header().Set("Content-Type", "application/json")
bytes, err := json.Marshal(data)
if err != nil {
ctx.writer.Write([] byte (err.Error()))
} else {
ctx.writer.Write(bytes)
}
}
func (ctx *Context) Write(statusCode int, data []byte) {
ctx.writer.WriteHeader(statusCode)
ctx.writer.Write(data)
}
func (ctx *Context) WriteString(statusCode int, data string) {
ctx.writer.WriteHeader(statusCode)
ctx.writer.Header().Set("Content-Type", "text/plain")
ctx.writer.Write([]byte(data))
}
func newContext(writer http.ResponseWriter, request *http.Request) *Context {
return &Context{
writer: writer,
request: request,
Method: request.Method,
}
}
func (engine *Engine) addRouter(method string, pattern string, handler HandlerFunc) {
key := method + "-" + pattern
engine.router[key] = handler
}
func (engine *Engine) Get(pattern string, handler HandlerFunc) {
engine.addRouter("GET", pattern, handler)
}
func (engine *Engine) Post(pattern string, handler HandlerFunc) {
engine.addRouter("POST", pattern, handler)
}
func (engine *Engine) Delete(pattern string, handler HandlerFunc) {
engine.addRouter("DELETE", pattern, handler)
}
func (engine *Engine) Run(addr string) {
http.ListenAndServe(addr, engine)
}
func (engine *Engine) ServeHTTP(w http.ResponseWriter, request *http.Request) {
key := request.Method + "-" + request.URL.Path
if handler, ok := engine.router[key]; ok {
context := newContext(w, request)
handler(context)
} else {
w.Write([]byte("404 NOT FOUND!"))
}
}
func main() {
engine := New()
engine.addRouter("GET", "/", func(ctx *Context) {
ctx.Write(500, []byte("server error"))
})
engine.Get("/get", func(ctx *Context) {
name := ctx.Query("name")
ctx.JSON(200, H{
"name": name,
"method": ctx.Method,
})
})
engine.Post("/post", func(ctx *Context) {
ctx.WriteString(200, "post method")
})
engine.Run(":9999")
}