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))
}













猜你喜欢

转载自www.cnblogs.com/sunlong88/p/11260973.html