Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/golang-acexy/starter-gin
基于github.com/gin-gonic/gin封装的http服务组件
https://github.com/golang-acexy/starter-gin
framework gin web
Last synced: about 2 months ago
JSON representation
基于github.com/gin-gonic/gin封装的http服务组件
- Host: GitHub
- URL: https://github.com/golang-acexy/starter-gin
- Owner: golang-acexy
- License: apache-2.0
- Created: 2023-08-01T02:26:34.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-12-21T09:02:25.000Z (about 2 months ago)
- Last Synced: 2024-12-21T10:18:13.924Z (about 2 months ago)
- Topics: framework, gin, web
- Language: Go
- Homepage:
- Size: 172 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# starter-gin
```
go get github.com/golang-acexy/starter-gin
```基于`github.com/gin-gonic/gin`封装的http服务组件
---
#### 功能说明
屏蔽其他原始框架细节,提供统一的http服务注册方法,用户只需要关心Request/Response即可
- 初始化
```go
var starterLoader *parent.StarterLoader
// 默认Gin表现行为
// 启用了非200状态码自动包裹响应
func TestGinDefault(t *testing.T) {
starterLoader = parent.NewStarterLoader([]parent.Starter{
&ginstarter.GinStarter{
ListenAddress: ":8080",
DebugModule: true,
Routers: []ginstarter.Router{
&router.DemoRouter{},
&router.ParamRouter{},
&router.AbortRouter{},
&router.BasicAuthRouter{},
&router.MyRestRouter{},
},
InitFunc: func(instance *gin.Engine) {
instance.GET("/ping", func(context *gin.Context) {
context.String(http.StatusOK, "alive")
})
instance.GET("/err", func(context *gin.Context) {
context.Status(500)
})
},
DisableDefaultIgnoreHttpCode: true,
},
})
err := starterLoader.Start()
if err != nil {
fmt.Printf("%+v\n", err)
return
}
sys.ShutdownHolding()
}
```- 注册路由
```go
type RouterInfo struct {
// GroupPath 路由分组路径
GroupPath string
// 该Router下的中间件执行器
Middlewares []Middleware
}
```- 请求
框架已封装常用的参数获取方法,在Handler中直接通过request执行,以`Must`开始的方法将在参数不满足条件时直接触发Panic,快速实现验参数不通过中断请求```go
// HttpMethod 获取请求方法
HttpMethod() string
// RequestPath 获取请求全路径
RequestPath() string
// RawGinContext 获取原始Gin上下文
RawGinContext() *gin.Context
// RequestIP 尝试获取请求方客户端IP
RequestIP() string
// GetPathParam 获取path路径参数 /:id/
GetPathParam(name string) string
// GetPathParams 获取path路径参数 /:id/ 多个参数
GetPathParams(names ...string) map[string]string
// BindPathParams /:id/ 绑定结构体用于接收UriPath参数 结构体标签格式 `uri:""`
BindPathParams(object any) error
// MustBindPathParams /:id/ 绑定结构体用于接收UriPath参数 结构体标签格式 `uri:""`
// 任何错误将触发Panic流程中断
MustBindPathParams(object any)
...
```
- 响应 框架已封装常用响应体方法,方法均以`Resp`开始```go
// RespJson 响应Json数据
func RespJson(data any, httpStatusCode ...int) Response
// RespXml 响应Xml数据
func RespXml(data any, httpStatusCode ...int) Response
// RespYaml 响应Yaml数据
func RespYaml(data any, httpStatusCode ...int) Response
// RespToml 响应Toml数据
func RespToml(data any, httpStatusCode ...int) Response
// RespTextPlain 响应Json数据
func RespTextPlain(data string, httpStatusCode ...int) Response
// RespRedirect 响应重定向
func RespRedirect(url string, httpStatusCode ...int) Response
```
#### 特别的Rest响应,默认框架已定制一套Rest响应标准
```go
// RestRespStatusStruct 框架默认的Rest请求状态结构
type RestRespStatusStruct struct {
// 标识请求系统状态 200 标识网络请求层面的成功 见StatusCode
StatusCode StatusCode `json:"statusCode"`
StatusMessage StatusMessage `json:"statusMessage"`
// 业务错误码 仅当StatusCode为200时进入业务错误判断
BizErrorCode *BizErrorCode `json:"bizErrorCode"`
BizErrorMessage *BizErrorMessage `json:"bizErrorMessage"`
// 系统响应时间戳
Timestamp int64 `json:"timestamp"`
}
// RestRespStruct 框架默认的Rest请求结构
type RestRespStruct struct {
// 请求状态描述
Status *RestRespStatusStruct `json:"status"`
// 仅当StatusCode为200 无业务错误码BizErrorCode 响应成功数据
Data any `json:"data"`
}
```
通过`RespRest`开始的方法名执行该结构体的Rest风格响应,如果需要在此基础上响应更多信息,则可以使用`NewRespRest()`创建Rest响应实例,设置head、cookie等其他信息> 如果你要自定义Rest结构体响应风格
参考test/router/myrest.go
方法1 通过NewRespRest()实例,每次传输自定义的Rest结构体响应
```go
ginstarter.NewRespRest().SetDataResponse(&RestStruct{
Code: 200,
Msg: "success",
Data: "invoke",
})
```方法2 实现`Response`接口,参照NewRespRest方法设计,定制并使用自定义Response数据响应
```go// 自实现Response响应数据
// 自实现Response响应数据
func (m *MyRestRouter) m3() ginstarter.HandlerWrapper {
return func(request *ginstarter.Request) (ginstarter.Response, error) {
response := &MyRestResponse{}
response.setData("my rest impl")
return response, nil
}
}type MyRestResponse struct {
responseData *ginstarter.ResponseData
}func (m *MyRestResponse) Data() *ginstarter.ResponseData {
return m.responseData
}func (m *MyRestResponse) setData(data any) {
m.responseData = ginstarter.NewResponseData()
m.responseData.SetData(json.ToJsonBytes(&RestStruct{
Code: 200,
Msg: "success",
Data: data,
}))
}
```#### 高级用法
```go
type GinStarter struct {
// 模块组件在启动时执行初始化
InitFunc func(instance *gin.Engine)
// * 注册业务路由
Routers []Router
// * 注册服务监听地址 :8080 (默认)
ListenAddress string // ip:port
// 默认情况系统会将捕获的异常详细发给PanicResolver处理,如果不想将细节暴露向外
// 方案 1. 启用隐藏异常细节功能,系统将在触发panic重要错误时不再调用PanicResolver处理,并统一响应500错误
// 方案 2. 如果不想禁用异常时调度PanicResolver, 可以在初始化时手动设置自定义PanicResolver处理器
// * panic 将被分为框架内部错误和框架未知错误 框架内部错误是非敏感错误,不受该参数控制,每次触发PanicResolver,例如验证框架错误
HidePanicErrorDetails bool
// 全局异常响应处理器 如果不指定则使用默认方式
PanicResolver PanicResolver
// 禁用异常http响应码Resolver
DisableBadHttpCodeResolver bool
// 启用异常http响应码Resolver 系统已内置常见的不处理的非正常响应码 可以禁用
DisableDefaultIgnoreHttpCode bool
// 启用异常http响应码Resolver 指定不处理特定的异常响应码
IgnoreHttpCode []int
// 启用异常http响应码Resolver 如果不指定则使用默认方式
BadHttpCodeResolver BadHttpCodeResolver
// 自定义全局中间件 作用于所有请求 按照顺序执行
GlobalMiddlewares []Middleware
// 响应数据的结构体解码器 默认为JSON方式解码
// 在使用NewRespRest响应结构体数据时解码为[]byte数据的解码器
// 如果自实现Response接口将不使用解码器
ResponseDataStructDecoder ResponseDataStructDecoder
// ========== gin config
DebugModule bool
MaxMultipartMemory int64
// 关闭包裹405错误展示,使用404代替
DisableMethodNotAllowedError bool
// 禁用尝试获取转发真实IP
DisableForwardedByClientIP bool
}
```