天天看點

httpserver支援路由傳輸控制器

httpserver支援路由傳輸控制器
httpserver支援路由傳輸控制器

main.go

package main

import (
    "net/http"

    "com.jtthink.net/myhttpserver/core"
)

type MyHandler struct {

}
func(*MyHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request){

     writer.Write([]byte("hello,myhandler"))
}

func main()  {

    router:=core.DefaultRouter()

    router.Add("/",&NewsController{})


    http.ListenAndServe(":8099",router)


}      
NewsController.go      
package main

import "com.jtthink.net/myhttpserver/core"

type NewsController struct {
    core.MyController
}

func(this *NewsController) GET()  {
   this.Ctx.WriteString("this is newscontroller")
}

func(this *NewsController) POST()  {
    this.Ctx.WriteString("this is newscontroller for POST")
}      
MyRouter.go      
package core

import (
    "net/http"
)
type MyHandlerFunc func(ctx *MyContext)
type MyRouter struct {
    Mapping map[string]ControllerInterface

}

func DefaultRouter() *MyRouter {
     return &MyRouter{make(map[string]ControllerInterface)}
}
//加入 path 和Controller的對應關系
func(this *MyRouter) Add(path string,c ControllerInterface)  {
    this.Mapping[path]=c
}

func(this *MyRouter) ServeHTTP(writer http.ResponseWriter, request *http.Request){
    //chrome 會預設請求圖示位址
    if f,OK:=this.Mapping[request.URL.Path];OK{
         f.Init(&MyContext{request,writer}) //關鍵代碼
         if request.Method=="GET"{//沒有做防錯處理
             f.GET()
         }
        if request.Method=="POST"{//沒有做防錯處理
            f.POST()
        }
    }




}      
MyController.go      
package core

type MyController struct {
    Ctx *MyContext
}

func(this *MyController) Init (ctx *MyContext)  {
    this.Ctx=ctx
}

type ControllerInterface interface {
    Init(ctx *MyContext)
    GET()
    POST()
}      
MyContext.go      
package core

import "net/http"

type MyContext struct { //上下文對象
      request *http.Request
      http.ResponseWriter
}
func(this *MyContext) WriteString(str string){
    this.Write([]byte(str))
}