您的位置 首页 golang

「golang」手写一个简单的web框架

参照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")
}
  

文章来源:智云一二三科技

文章标题:「golang」手写一个简单的web框架

文章地址:https://www.zhihuclub.com/99163.shtml

关于作者: 智云科技

热门文章

网站地图