{"id":23430062,"url":"https://github.com/golang-acexy/starter-gin","last_synced_at":"2026-04-22T02:32:27.290Z","repository":{"id":185280804,"uuid":"673159506","full_name":"golang-acexy/starter-gin","owner":"golang-acexy","description":"基于github.com/gin-gonic/gin封装的http服务组件","archived":false,"fork":false,"pushed_at":"2026-04-21T07:53:00.000Z","size":288,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-21T09:41:12.219Z","etag":null,"topics":["framework","gin","web"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/golang-acexy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-08-01T02:26:34.000Z","updated_at":"2026-04-21T07:51:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"fea7793f-cc08-4173-8680-ad6e5a2231bd","html_url":"https://github.com/golang-acexy/starter-gin","commit_stats":null,"previous_names":["golang-acexy/starter-gin"],"tags_count":43,"template":false,"template_full_name":null,"purl":"pkg:github/golang-acexy/starter-gin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golang-acexy%2Fstarter-gin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golang-acexy%2Fstarter-gin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golang-acexy%2Fstarter-gin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golang-acexy%2Fstarter-gin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/golang-acexy","download_url":"https://codeload.github.com/golang-acexy/starter-gin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golang-acexy%2Fstarter-gin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32118104,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T00:31:26.853Z","status":"online","status_checked_at":"2026-04-22T02:00:05.693Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["framework","gin","web"],"created_at":"2024-12-23T08:14:50.494Z","updated_at":"2026-04-22T02:32:27.285Z","avatar_url":"https://github.com/golang-acexy.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# starter-gin\n\n```\ngo get github.com/golang-acexy/starter-gin\n```\n\n基于`github.com/gin-gonic/gin`封装的http服务组件\n\n---\n\n#### 功能说明\n\n屏蔽其他原始框架细节，提供统一的http服务注册方法，用户只需要关心Request/Response即可\n\n- 初始化\n  ```go\n  var starterLoader *parent.StarterLoader\n  \n  // 默认Gin表现行为\n  // 启用了非200状态码自动包裹响应\n  func TestGinDefault(t *testing.T) {\n      starterLoader = parent.NewStarterLoader([]parent.Starter{\n          \u0026ginstarter.GinStarter{\n              ListenAddress: \":8080\",\n              DebugModule:   true,\n              Routers: []ginstarter.Router{\n                  \u0026router.DemoRouter{},\n                  \u0026router.ParamRouter{},\n                  \u0026router.AbortRouter{},\n                  \u0026router.BasicAuthRouter{},\n                  \u0026router.MyRestRouter{},\n              },\n              InitFunc: func(instance *gin.Engine) {\n                  instance.GET(\"/ping\", func(context *gin.Context) {\n                      context.String(http.StatusOK, \"alive\")\n                  })\n                  instance.GET(\"/err\", func(context *gin.Context) {\n                      context.Status(500)\n                  })\n              },\n              DisableDefaultIgnoreHttpCode: true,\n          },\n      })\n      err := starterLoader.Start()\n      if err != nil {\n          fmt.Printf(\"%+v\\n\", err)\n          return\n      }\n      sys.ShutdownHolding()\n  }\n  ```\n\n- 注册路由\n\n  ```go\n  type RouterInfo struct {\n    // GroupPath 路由分组路径\n    GroupPath string\n  \n    // 该Router下的中间件执行器\n    Middlewares []PreInterceptor\n  }\n  ```\n\n- 请求\n  框架已封装常用的参数获取方法，在Handler中直接通过request执行，以`Must`开始的方法将在参数不满足条件时直接触发Panic，快速实现验参数不通过中断请求\n\n    ```go\n    // HttpMethod 获取请求方法\n    HttpMethod() string\n    \n    // RequestPath 获取请求全路径\n    RequestPath() string\n    \n    // RawGinContext 获取原始Gin上下文\n    RawGinContext() *gin.Context\n    \n    // RequestIP 尝试获取请求方客户端IP\n    RequestIP() string\n    \n    \n    // GetPathParam 获取path路径参数 /:id/\n    GetPathParam(name string) string\n    \n    // GetPathParams 获取path路径参数 /:id/ 多个参数\n    GetPathParams(names ...string) map[string]string\n    \n    // BindPathParams /:id/ 绑定结构体用于接收UriPath参数 结构体标签格式 `uri:\"\"`\n    BindPathParams(object any) error\n    \n    // MustBindPathParams /:id/ 绑定结构体用于接收UriPath参数 结构体标签格式 `uri:\"\"`\n    // 任何错误将触发Panic流程中断\n    MustBindPathParams(object any)\n    ...\n    ```\n- 响应 框架已封装常用响应体方法，方法均以`Resp`开始\n\n    ```go\n    // RespJson 响应Json数据\n    func RespJson(data any, httpStatusCode ...int) Response\n    \n    // RespXml 响应Xml数据\n    func RespXml(data any, httpStatusCode ...int) Response\n    \n    // RespYaml 响应Yaml数据\n    func RespYaml(data any, httpStatusCode ...int) Response\n    \n    // RespToml 响应Toml数据\n    func RespToml(data any, httpStatusCode ...int) Response\n    \n    // RespTextPlain 响应Json数据\n    func RespTextPlain(data string, httpStatusCode ...int) Response\n    \n    // RespRedirect 响应重定向\n    func RespRedirect(url string, httpStatusCode ...int) Response\n    ```\n  #### 特别的Rest响应，默认框架已定制一套Rest响应标准\n    ```go\n    // RestRespStatusStruct 框架默认的Rest请求状态结构\n    type RestRespStatusStruct struct {\n    \n        // 标识请求系统状态 200 标识网络请求层面的成功 见StatusCode\n        StatusCode    StatusCode    `json:\"statusCode\"`\n        StatusMessage StatusMessage `json:\"statusMessage\"`\n    \n        // 业务错误码 仅当StatusCode为200时进入业务错误判断\n        BizErrorCode    *BizErrorCode    `json:\"bizErrorCode\"`\n        BizErrorMessage *BizErrorMessage `json:\"bizErrorMessage\"`\n    \n        // 系统响应时间戳\n        Timestamp int64 `json:\"timestamp\"`\n    }\n    \n    // RestRespStruct 框架默认的Rest请求结构\n    type RestRespStruct struct {\n    \n        // 请求状态描述\n        Status *RestRespStatusStruct `json:\"status\"`\n    \n        // 仅当StatusCode为200 无业务错误码BizErrorCode 响应成功数据\n        Message any `json:\"data\"`\n    }\n    ```\n  通过`RespRest`开始的方法名执行该结构体的Rest风格响应，如果需要在此基础上响应更多信息，则可以使用`NewRespRest()`创建Rest响应实例，设置head、cookie等其他信息\n\n  \u003e 如果你要自定义Rest结构体响应风格\n\n  参考test/router/myrest.go\n\n  方法1 通过NewRespRest()实例，每次传输自定义的Rest结构体响应\n\n    ```go\n    ginstarter.NewRespRest().SetDataResponse(\u0026RestStruct{\n\t\t\tCode: 200,\n\t\t\tMsg:  \"success\",\n\t\t\tMessage: \"invoke\",\n\t\t})\n    ```\n\n  方法2 实现`Response`接口，参照NewRespRest方法设计，定制并使用自定义Response数据响应\n\n    ```go// 自实现Response响应数据\n    // 自实现Response响应数据\n\tfunc (m *MyRestRouter) m3() ginstarter.HandlerWrapper {\n\t\treturn func(request *ginstarter.Request) (ginstarter.Response, error) {\n\t\t\tresponse := \u0026MyRestResponse{}\n\t\t\tresponse.setData(\"my rest impl\")\n\t\t\treturn response, nil\n\t\t}\n\t}\n\n\ttype MyRestResponse struct {\n\t\tresponseData *ginstarter.ResponseData\n\t}\n\n\tfunc (m *MyRestResponse) Message() *ginstarter.ResponseData {\n\t\treturn m.responseData\n\t}\n\n\tfunc (m *MyRestResponse) setData(data any) {\n\t\tm.responseData = ginstarter.NewResponseData()\n\t\tm.responseData.SetData(json.ToJsonBytes(\u0026RestStruct{\n\t\t\tCode: 200,\n\t\t\tMsg:  \"success\",\n\t\t\tMessage: data,\n\t\t}))\n\t}\n    ```\n\n#### 高级用法\n\n```go\ntype GinStarter struct {\n    \n    // 模块组件在启动时执行初始化\n    InitFunc func(instance *gin.Engine)\n    \n    // * 注册业务路由\n    Routers []Router\n    \n    // * 注册服务监听地址 :8080 (默认)\n    ListenAddress string // ip:port\n    \n    // 默认情况系统会将捕获的异常详细发给PanicResolver处理，如果不想将细节暴露向外\n    // 方案 1. 启用隐藏异常细节功能，系统将在触发panic重要错误时不再调用PanicResolver处理，并统一响应500错误\n    // 方案 2. 如果不想禁用异常时调度PanicResolver, 可以在初始化时手动设置自定义PanicResolver处理器\n    // * panic 将被分为框架内部错误和框架未知错误 框架内部错误是非敏感错误，不受该参数控制，每次触发PanicResolver，例如验证框架错误\n    HidePanicErrorDetails bool\n    // 全局异常响应处理器 如果不指定则使用默认方式\n    PanicResolver PanicResolver\n    \n    // 禁用异常http响应码Resolver\n    DisableBadHttpCodeResolver bool\n    // 启用异常http响应码Resolver 系统已内置常见的不处理的非正常响应码 可以禁用\n    DisableDefaultIgnoreHttpCode bool\n    // 启用异常http响应码Resolver 指定不处理特定的异常响应码\n    IgnoreHttpCode []int\n    // 启用异常http响应码Resolver 如果不指定则使用默认方式\n    BadHttpCodeResolver BadHttpCodeResolver\n    \n    // 自定义全局中间件 作用于所有请求 按照顺序执行\n    GlobalMiddlewares []PreInterceptor\n    \n    // 响应数据的结构体解码器 默认为JSON方式解码\n    // 在使用NewRespRest响应结构体数据时解码为[]byte数据的解码器\n    // 如果自实现Response接口将不使用解码器\n    ResponseDataStructDecoder ResponseDataStructDecoder\n    \n    // ========== gin config\n    DebugModule        bool\n    MaxMultipartMemory int64\n    \n    // 关闭包裹405错误展示，使用404代替\n    DisableMethodNotAllowedError bool\n    \n    // 禁用尝试获取转发真实IP\n    DisableForwardedByClientIP bool\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgolang-acexy%2Fstarter-gin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgolang-acexy%2Fstarter-gin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgolang-acexy%2Fstarter-gin/lists"}