go-api-framework
go基于gin三层架构web框架
三层架构模式
func RegisterHandler(业务最终函数,怎么取参数,怎么处理业务结果) func(context *gin.Context) {
xxxxxoooo
}
这个就是最终的结果
unc RegisterHandler(业务最终函数,怎么取参数,怎么处理业务结果) func(context *gin.Context) {
参数:=怎么取参数()
业务结果:=业务最终函数(参数)
怎么处理业务结果(业务结果)
}
首先要定义原型
业务最终函数
type Endpoint func(ctx context.Context,request interface{}) (response interface{}, err error)
一律使用interface{} 。这样可以处理不同的类型
怎么取参数 :
type EncodeRequestFunc func(*gin.Context, interface{}) (interface{}, error)
怎么处理响应:
type DecodeResponseFunc func(*gin.Context, interface{}) error
然后写成这样
func RegisterHandler(endpoint Endpoint,encodeFunc EncodeRequestFunc,decodeFunc DecodeResponseFunc) func(context *gin.Context){
return func(context *gin.Context) {
req,err:=encodeFunc(context,nil)
if err!=nil{
context.JSON(500,gin.H{"error":"param err"+err.Error()})
return
}
res,err:=endpoint(context,req)
if err!=nil{
context.JSON(500,gin.H{"error":err})
}else{
err:=decodeFunc(context,res)
if err!=nil{
context.JSON(500,gin.H{"error":err})
}
}
}
}
最终核心结构:
package App
import (
"context"
"fmt"
"github.com/gin-gonic/gin"
)
type Middleware func(Endpoint) Endpoint
//业务最终函数原型
type Endpoint func(ctx context.Context,request interface{}) (response interface{}, err error)
//怎么取参数
type EncodeRequestFunc func(*gin.Context) (interface{}, error)
//怎么处理业务结果
type DecodeResponseFunc func(*gin.Context, interface{}) error
func RegisterHandler(endpoint Endpoint,encodeFunc EncodeRequestFunc, decodeFunc DecodeResponseFunc) func(context *gin.Context){
return func(context *gin.Context) {
defer func() {
if r:=recover();r!=nil{
fmt.Fprintln(gin.DefaultWriter,fmt.Sprintf("fatal error:%s",r))
context.JSON(500,gin.H{"error":fmt.Sprintf("fatal error:%s",r)})
return
}
}()
//参数:=怎么取参数(context)
//业务结果,error:=业务最终函数(context,参数)
//
//
//怎么处理业务结果(业务结果)
req,err:=encodeFunc(context) //获取参数
if err!=nil{
context.JSON(400,gin.H{"error":"param error:"+err.Error()})
return
}
rsp,err:=endpoint(context,req) //执行业务过程
if err!=nil{
fmt.Fprintln(gin.DefaultWriter,"response error:",err)
context.JSON(400,gin.H{"error":"response error:"+err.Error()})
return
}
err=decodeFunc(context,rsp) //处理 业务执行 结果
if err!=nil{
context.JSON(500,gin.H{"error":"server error:"+err.Error()})
return
}
}
}
github地址:https://github.com/sunlongv520/go-api-framework