st.Server中添加路由
[]rest.Route{ //路由数组
{
Method: http.MethodGet,
Path: "/from/:name", //路由
Handler: BaseHandlerFunc(serverCtx,logic.GreetLogic{}),
},
{
Method: http.MethodGet,
Path: "/to/:name", //路由
Handler: BaseHandlerFunc(serverCtx,logic.CustomLogic{}),
},
},
)
}
其他地方不需要修改
我们启动一下
go run greet.go -f etc/greet-api.yaml
然后在浏览器中请求一下http://localhost:8888/from/you
、http://localhost:8888/to/you
、http://localhost:8888/too/you
现在,在添加新的logic做路由映射时,就可以直接简化掉添加xxxxhandler.go
文件了,实际上是将这个Handler移动到了xxxxlogic.go中。
新手,不喜轻喷
五、后面对于之前繁琐的泛型使用进行了简化
BaseHandlerFunc中改为
func BaseHandlerFunc[T logic.BaseLogic](svcCtx *svc.ServiceContext, t T) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.Request
if err := httpx.Parse(r, &req); err != nil {
httpx.Error(w, err)
return
}
var ins T
ins.Handler(req, w, r, svcCtx)
//通过泛型动态调用不同结构体的Handler方法
// cc := logic.New[T]()
// cc.LogicHandler(req, w, r, svcCtx)
}
}
baselogic.go改为
package logic
import (
"greet/internal/svc"
"greet/internal/types"
"net/http"
)
type BaseLogic interface {
any
Handler(req types.Request, w http.ResponseWriter, r *http.Request, svcCtx *svc.ServiceContext) //每一个结构体中必须要继承一下Handler方法,例如customlogic.go和greetlogic.go中的Handler方法
}
// type logic[T BaseLogic] struct {
// data T
// }
// func New[T BaseLogic]() logic[T] {
// c := logic[T]{}
// var ins T
// c.data = ins
// return c
// }
// func (a *logic[T]) LogicHandler(req types.Request, w http.ResponseWriter, r *http.Request, svcCtx *svc.ServiceContext) {
// a.data.Handler(req, w, r, svcCtx)
// }
这样就可以了