sgin

package module
v0.0.13 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 22, 2025 License: MIT Imports: 44 Imported by: 0

README

sgin

这是一个 gin 的封装版本,旨在提供更加智能、简洁的 API 开发体验,并且完美兼容原生 gin, gin.HandlerFunc (包括中间件处理) 。

它通过增强的 Handler 签名、参数绑定、统一的响应处理、错误处理、自动化 OpenAPI 文档生成和多语言校验错误等支持,让开发者专注于业务逻辑。

安装

go get github.com/baagod/sgin

快速开始

 r := sgin.New(sgin.Config{})
 r.GET("/", func(c *sgin.Ctx) string {
     return "Hello sgin!"
 })
 r.Run(":8080")

核心功能

sgin 的核心价值在于提供更加智能、简洁的 API 开发体验。以下是你需要了解的核心功能。

智能 Handler 签名

sgin 支持多种灵活的 Handler 签名,自动处理参数绑定和响应发送。

支持的签名示例:

  • func(*gin.Context): 兼容 gin.HandlerFunc
  • func(*sgin.Ctx) error
  • func(*sgin.Ctx) (any, error)
  • func(*sgin.Ctx, input Struct) (any, error)
  • func(*sgin.Ctx, input Struct) (any)
  • func(*sgin.Ctx, input *Struct): 支持绑定指针结构体
请求参数绑定

只需在 Handler 的第二个参数定义结构体,sgin 会自动将其与 URIHeaderQueryFormBody (JSON/XML) 的数据绑定。如下:

type User struct {
    ID    int    `uri:"id" binding:"required"`
	Name  string `form:"name" binding:"required" label:"姓名"`
    Age   int    `form:"age" default:"18"`
    Token string `header:"Authorization"`
}

r.POST("/users/:id", func(c *sgin.Ctx, p User) (map[string]any, error) {
    return map[string]any{"id": p.ID, "name": p.Name, "age": p.Age}, nil
})
统一响应处理

Handler 的返回值会被自动处理:

  • error: 调用配置的 ErrorHandlererror.Error() 返回。
  • data: 根据请求头 Accept 格式化为 JSON, XMLText

你也可以使用 c.Send() 发送指定数据:

c.Send("Hello") // Text
c.Send(User{})  // 根据请求头 `Accept` 返回对应格式的数据
c.Send(sgin.BodyXML(User{}))  // 手动指定格式
c.Send(err)                   // Error
增强的 sgin.Ctx

sgin.Ctx 封装了 gin.Context,提供更便捷 API。以下是所有可用方法的完整指南:

参数获取

sgin 统一处理来自不同来源的参数(Query, Form, JSON, XML, Multipart),并提供类型安全的访问方法。

  • Values() map[string]any: 获取所有请求参数的键值对(Body 覆盖 Query)
  • Value(string, ...string) string: 获取字符串参数,支持默认值
  • ValueAny(string, ...any) any, ValueInt, ...: 获取查询或请求体参数
  • ValueFile(string) (*multipart.FileHeader, error): 获取上传的文件
  • SaveFile(*multipart.FileHeader, string) error: 保存上传的文件到指定路径
请求信息
  • Method() string: 获取 HTTP 方法
  • IP() string: 获取客户端 IP 地址
  • Path(full ...bool) string: 获取请求路径(full=true 返回路由定义路径)
  • Param(key string) string: 获取路径参数(如 /users/:id 中的 id
  • GetHeader(key string, value ...string) string: 获取支持默认值的请求头
  • RawBody() []byte: 获取原始请求体 (支持多次读取)
  • StatusCode() int: 获取响应状态码
  • Cookie(name string) (string, error): 获取 Cookie 值
  • SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool): 设置 Cookie
响应控制
  • Send(body any, format ...string) error: 发送响应,自动根据 Accept 头协商格式
  • Status(code int) *Ctx: 设置响应状态码(链式调用)
  • Header(key string, value string) *Ctx: 设置响应头(链式调用)
  • Content(value string) *Ctx: 设置 Content-Type 头(链式调用)

支持的响应体格式:

  • sgin.BodyJSON(any): 返回 JSON
  • sgin.BodyXML(any): 返回 XML
  • sgin.BodyText(any): 返回纯文本
  • sgin.BodyUpload(any): 文件上传
  • sgin.BodyDownload(any): 文件下载
  • sgin.BodyHTML(name string, data any): 返回 HTML
上下文存储与中间件
  • Get(key string, value ...any) any: 获取或设置上下文值,不会发生 panic
  • Next() error: 执行下一个中间件或处理器
追踪与调试
  • TraceID() string: 获取当前请求的跟踪 ID(自动生成或从 X-Request-ID 头读取)
  • Gin() *gin.Context: 返回底层的 *gin.Context(用于访问原生 gin 功能)
多语言支持
  • Locale() language.Tag: 获取当前请求的语言设置
  • SetLocale(locale language.Tag): 手动设置请求语言(覆盖自动检测)
Engine API

sgin.Engine 是框架的核心入口,它封装了 gin.Engine 并提供了更简洁、一致的 API 设计。以下是 Engine 的主要方法:

  • New(config ...sgin.Config) *sgin.Engine: 创建新的 sgin 实例,支持可选配置
  • Run(addr string, certfile ...string) error: 启动 HTTP(S) 服务器,通过可选参数支持 HTTPS
  • RunListener(listener net.Listener) error: 通过指定的监听器启动服务器
  • Gin() *gin.Engine: 获取底层的 gin.Engine 实例 (用于访问原生功能) 。
使用示例
// 1. 极简初始化
app := sgin.New()

// 2. 链式路由定义(继承自 Router)
app.GET("/", func(c *sgin.Ctx) string {
  return "Hello sgin!"
})

// 3. 启动 HTTP 服务
go app.Run(":8080")

// 4. 启动 HTTPS 服务
go app.Run(":8443", "cert.pem", "cert.key")

// 5. 通过监听器启动(灵活部署)
listener, _ := net.Listen("tcp", ":9090")
app.RunListener(listener)

// 6. 访问底层 gin(逃生舱模式)
ginEngine := app.Gin()
ginEngine.Static("/static", "./assets")

配置详解

sgin 提供了灵活的配置选项,所有配置都在 sgin.Config 结构体中设置。以下是所有可用配置的详细说明:

基础配置
r := sgin.New(sgin.Config{
    // 运行模式 (可选: gin.DebugMode, gin.ReleaseMode, gin.TestMode)
    Mode: gin.ReleaseMode,
    
    // 受信任的代理IP列表,用于获取真实客户端IP
    TrustedProxies: []string{"192.168.1.0/24"},
    
    // 自定义错误处理器
    ErrorHandler: func(c *sgin.Ctx, err error) error {
        // 可以根据错误类型返回不同的状态码和消息
        return c.Status(500).Send(map[string]any{
            "error": err.Error(),
            "code":  500,
        })
    },
    
    // 自定义日志处理器
    // text: 控制台友好格式,json: 结构化JSON格式
    // 返回 true 继续输出默认日志,false 拦截日志输出
    Logger: func(c *sgin.Ctx, text string, json string) bool {
        // 开发环境输出彩色日志
        fmt.Print(text)
        // 生产环境可以记录JSON日志
        // log.Info(json)
        return false // 拦截默认日志输出
    },
})
OpenAPI 配置

sgin 可以通过分析 Handler 的输入输出结构体,自动生成 OpenAPI 3.1 文档。启用后,框架会自动生成规范文件和交互式文档页面。

启用方法

import "github.com/baagod/sgin/oa"

r := sgin.New(sgin.Config{
    OpenAPI: oa.New(oa.Config{
        // OpenAPI 规范基本信息
        Info: oa.Info{
            Title:       "我的API",
            Description: "这是一个示例API",
            Version:     "1.0.0",
        },
    }),
})

文档自定义: 在路由定义的第一个参数传入 func(*oa.Operation) 来补充文档信息。

import "github.com/baagod/sgin/oa"

type LoginReq struct {
    Username string `json:"username" doc:"用户名"`
    Password string `json:"password" doc:"密码"`
}

// 注册路由时添加文档描述
r.POST("/login", func(op *oa.Operation) {
    op.Summary = "用户登录"
    op.Tags = []string{"Auth"}
    op.Description = "用户登录接口,返回认证令牌"
}, func(c *sgin.Ctx, req LoginReq) (string, error) {
    // 业务逻辑...
    return "token-xxx", nil
})

启动后访问以下URL查看生成的文档:

  • /openapi.yaml - OpenAPI 规范文件
  • /docs - 交互式API文档页面
Panic 恢复配置

sgin 内置了一个增强的 Recovery 中间件,相比原生 gin,它提供了更强大的调试能力:

r := sgin.New(sgin.Config{
    // Panic 恢复回调
    Recovery: func(c *sgin.Ctx, logStr, jsonStr string) {
        // 1. 控制台打印美观的彩色日志 (推荐开发环境)
        fmt.Print(logStr)
        
        // 2. 将结构化 JSON 日志写入文件 (推荐生产环境)
        // 包含时间、请求信息、完整堆栈和源码上下文
        f, _ := os.OpenFile("panic.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
        defer f.Close()
        f.WriteString(jsonStr + "\n")
    },
})
控制台彩色输出
PANIC RECOVERED 
Time:         2025-12-22 14:30:25
Request:      GET /api/deep-panic
Host:         localhost:8080
Content-Type: application/json
IP:           127.0.0.1
TraceID:      c8h3q9b6t0v2m5x7
Error:        runtime error: invalid memory address or nil pointer dereference

File: example/main.go:72 LoadUserProfile()
  69   func LoadUserProfile(userID string) (*UserProfile, error) {
  70       user := &UserProfile{Name: "测试用户", Profile: nil}
  71       // 加载用户详细信息
  72 >     profileName := user.Profile.Name // panic 发生在这里
  73       _ = profileName                  // 避免编译警告
  74       return user, nil
  75   }
 
File: example/main.go:80 GetUserProfile()
  77   // GetUserProfile 业务层函数
  78   func GetUserProfile(userID string) (*UserProfile, error) {
  79       // 调用模型层获取用户信息
  80 >     return LoadUserProfile(userID)
  81   }
  82   
  83   // HandleAPI API 层处理函数
 
File: example/main.go:86 HandleAPI()
  83   // HandleAPI API 层处理函数
  84   func HandleAPI(c *sgin.Ctx) {
  85       userID := c.Param("id")
  86 >     profile, err := GetUserProfile(userID)
  87       if err != nil {
  88           c.Send(err)
  89           return
 
File: reflect/value.go:586 call()
  583   }
  584   
  585   // Call.
  586 > call(frametype, fn, stackArgs, uint32(frametype.size), uint32(abid.retOffset), uint32(frameSize), &regArgs)
  587   
  588   // For testing; see TestCallMethodJump.
  589   if callGC {
结构化 JSON 输出
{
  "time": "2025-12-22 03:39:58",
  "method": "GET",
  "host": "localhost:8080",
  "path": "/api/users/123",
  "content": "",
  "ip": "::1",
  "traceid": "d544q3mn8dn4rk0e6h10",
  "error": "runtime error: invalid memory address or nil pointer dereference",
  "stack": [
    {
      "file": "example/main.go",
      "line": 74,
      "func": "LoadUserProfile",
      "source": "71   func LoadUserProfile(userID string) (*UserProfile, error) {\n72       user := &UserProfile{Name: \"测试用户\", Profile: nil}\n73       // 加载用户详细信息\n74 >     profileName := user.Profile.Name // panic 发生在这里\n75       _ = profileName                  // 避免编译警告\n76       return user, nil\n77   }\n"
    },
    {
      "file": "example/main.go",
      "line": 82,
      "func": "GetUserProfile",
      "source": "79   // GetUserProfile 业务层函数\n80   func GetUserProfile(userID string) (*UserProfile, error) {\n81       // 调用模型层获取用户信息\n82 >     return LoadUserProfile(userID)\n83   }\n84   \n85   // HandleAPI API 层处理函数\n"
    },
    {
      "file": "example/main.go",
      "line": 88,
      "func": "HandleAPI",
      "source": "85   // HandleAPI API 层处理函数\n86   func HandleAPI(c *sgin.Ctx) {\n87       userID := c.Param(\"id\")\n88 >     profile, err := GetUserProfile(userID)\n89       if err != nil {\n90           c.Send(err)\n91           return\n"
    },
    {
      "file": "reflect/value.go",
      "line": 586,
      "func": "call",
      "source": "583   }\n584   \n585   // Call.\n586 > call(frametype, fn, stackArgs, uint32(frametype.size), uint32(abid.retOffset), uint32(frameSize), &regArgs)\n587   \n588   // For testing; see TestCallMethodJump.\n589   if callGC {\n"
    }
  ]
}
多语言配置

sgin 提供完整的校验错误多语言本地化支持。配置 Locales 字段后,校验错误消息将自动根据客户端语言偏好返回对应语言的错误信息。

基础配置

import (
    "github.com/baagod/sgin"
    "golang.org/x/text/language"
)

r := sgin.New(sgin.Config{
    Locales: []language.Tag{
        language.Chinese,  // 默认语言(第一个)
        language.English,  // 备用语言
        // 可选:language.Japanese, language.Korean, language.French, 
        // language.Russian, language.German, language.Spanish
    },
})

字段标签:使用 label 标签为字段指定用户友好的名称。

type LoginReq struct {
    Username string `json:"username" label:"用户名" binding:"required,min=3"`
    Password string `json:"password" label:"密码" binding:"required,min=6"`
}

语言检测优先级

  1. 查询参数 ?lang=zh-CN
  2. Accept-Language 请求头(支持权重)
  3. 配置的第一个语言(默认)

完整示例

r.POST("/login", func(c *sgin.Ctx, req LoginReq) error {
    // 业务逻辑...
    return nil
})

// 客户端请求示例:
// POST /login?lang=zh-CN
// POST /login (携带 Accept-Language: zh-CN 头)
// 校验失败返回对应语言错误,如:"用户名不能为空"

sgin 目前支持以下语言:

  • 🇨🇳 中文 (Chinese, SimplifiedChinese)
  • 🇺🇸 英文 (English)
  • 🇯🇵 日文 (Japanese)
  • 🇰🇷 韩文 (Korean)
  • 🇫🇷 法文 (French)
  • 🇷🇺 俄文 (Russian)
  • 🇩🇪 德文 (German)
  • 🇪🇸 西班牙文 (Spanish)

可以通过 sgin.SupportedLanguages() 函数获取框架支持的所有语言标签。

Documentation

Index

Constants

View Source
const (
	FmtXML      = "XML"
	FmtJSON     = "JSON"
	FmtText     = "Text"
	FmtUpload   = "Upload"
	FmtDownload = "Download"
	FmtHTML     = "HTML"
)
View Source
const (
	MIMETextXML        = "text/xml"
	MIMETextHTML       = "text/html"
	MIMETextPlain      = "text/plain"
	MIMETextJavaScript = "text/javascript"
	MIMETextCSS        = "text/css"
	MIMETextYAML       = "text/yaml"
	MIMEXML            = "application/xml"
	MIMEJSON           = "application/json"
	MIMEJavaScript     = "application/javascript"
	MIMECBOR           = "application/cbor"
	MIMEForm           = "application/x-www-form-urlencoded"
	MIMEOctetStream    = "application/octet-stream"
	MIMEMultipartForm  = "multipart/form-data"
	MIMEMsgPack        = "application/vnd.msgpack"

	MIMETextXMLUTF8        = "text/xml; charset=utf-8"
	MIMETextHTMLUTF8       = "text/html; charset=utf-8"
	MIMETextPlainUTF8      = "text/plain; charset=utf-8"
	MIMETextJavaScriptUTF8 = "text/javascript; charset=utf-8"
	MIMETextCSSUTF8        = "text/css; charset=utf-8"
	MIMETextYAMLUTF8       = "text/yaml; charset=utf-8"
	MIMEXMLUTF8            = "application/xml; charset=utf-8"
	MIMEJSONUTF8           = "application/json; charset=utf-8"
)

MIME types that are commonly used

View Source
const (
	HeaderAuthorization                      = "Authorization"
	HeaderProxyAuthenticate                  = "Proxy-Authenticate"
	HeaderProxyAuthorization                 = "Proxy-Authorization"
	HeaderWWWAuthenticate                    = "WWW-Authenticate"
	HeaderAge                                = "Age"
	HeaderCacheControl                       = "Cache-Control"
	HeaderClearSiteData                      = "Clear-Site-Data"
	HeaderExpires                            = "Expires"
	HeaderPragma                             = "Pragma"
	HeaderWarning                            = "Warning"
	HeaderAcceptCH                           = "Accept-CH"
	HeaderAcceptCHLifetime                   = "Accept-CH-Lifetime"
	HeaderContentDPR                         = "Content-DPR"
	HeaderDPR                                = "DPR"
	HeaderEarlyData                          = "Early-Data"
	HeaderSaveData                           = "Save-Data"
	HeaderViewportWidth                      = "Viewport-Width"
	HeaderWidth                              = "Width"
	HeaderETag                               = "ETag"
	HeaderIfMatch                            = "If-Match"
	HeaderIfModifiedSince                    = "If-Modified-Since"
	HeaderIfNoneMatch                        = "If-None-Match"
	HeaderIfUnmodifiedSince                  = "If-Unmodified-Since"
	HeaderLastModified                       = "Last-Modified"
	HeaderVary                               = "Vary"
	HeaderConnection                         = "Connection"
	HeaderKeepAlive                          = "Keep-Alive"
	HeaderAccept                             = "Accept"
	HeaderAcceptCharset                      = "Accept-Charset"
	HeaderAcceptEncoding                     = "Accept-Encoding"
	HeaderAcceptLanguage                     = "Accept-Language"
	HeaderCookie                             = "Cookie"
	HeaderExpect                             = "Expect"
	HeaderMaxForwards                        = "Max-Forwards"
	HeaderSetCookie                          = "Set-Cookie"
	HeaderAccessControlAllowCredentials      = "Access-Control-Allow-Credentials"
	HeaderAccessControlAllowHeaders          = "Access-Control-Allow-Headers"
	HeaderAccessControlAllowMethods          = "Access-Control-Allow-Methods"
	HeaderAccessControlAllowOrigin           = "Access-Control-Allow-Origin"
	HeaderAccessControlExposeHeaders         = "Access-Control-Expose-Headers"
	HeaderAccessControlMaxAge                = "Access-Control-Max-Age"
	HeaderAccessControlRequestHeaders        = "Access-Control-Request-Headers"
	HeaderAccessControlRequestMethod         = "Access-Control-Request-Method"
	HeaderOrigin                             = "Origin"
	HeaderTimingAllowOrigin                  = "Timing-Allow-Origin"
	HeaderXPermittedCrossDomainPolicies      = "X-Permitted-Cross-Domain-Policies"
	HeaderDNT                                = "DNT"
	HeaderTk                                 = "Tk"
	HeaderContentDisposition                 = "Content-Disposition"
	HeaderContentEncoding                    = "Content-Encoding"
	HeaderContentLanguage                    = "Content-Language"
	HeaderContentLength                      = "Content-Length"
	HeaderContentLocation                    = "Content-Location"
	HeaderContentType                        = "Content-Type"
	HeaderForwarded                          = "Forwarded"
	HeaderVia                                = "Via"
	HeaderXForwardedFor                      = "X-Forwarded-For"
	HeaderXForwardedHost                     = "X-Forwarded-Host"
	HeaderXForwardedProto                    = "X-Forwarded-Proto"
	HeaderXForwardedProtocol                 = "X-Forwarded-Protocol"
	HeaderXForwardedSsl                      = "X-Forwarded-Ssl"
	HeaderXUrlScheme                         = "X-Url-Scheme"
	HeaderLocation                           = "Location"
	HeaderFrom                               = "From"
	HeaderHost                               = "Host"
	HeaderReferer                            = "Referer"
	HeaderReferrerPolicy                     = "Referrer-Policy"
	HeaderUserAgent                          = "User-Agent"
	HeaderAllow                              = "Allow"
	HeaderServer                             = "Server"
	HeaderAcceptRanges                       = "Accept-Ranges"
	HeaderContentRange                       = "Content-Range"
	HeaderIfRange                            = "If-Range"
	HeaderRange                              = "Range"
	HeaderContentSecurityPolicy              = "Content-Security-Policy"
	HeaderContentSecurityPolicyReportOnly    = "Content-Security-Policy-Report-Only"
	HeaderCrossOriginResourcePolicy          = "Cross-Origin-Resource-Policy"
	HeaderExpectCT                           = "Expect-CT"
	HeaderPermissionsPolicy                  = "Permissions-Policy"
	HeaderPublicKeyPins                      = "Public-Key-Pins"
	HeaderPublicKeyPinsReportOnly            = "Public-Key-Pins-Report-Only"
	HeaderStrictTransportSecurity            = "Strict-Transport-Security"
	HeaderUpgradeInsecureRequests            = "Upgrade-Insecure-Requests"
	HeaderXContentTypeOptions                = "X-Content-Type-Options"
	HeaderXDownloadOptions                   = "X-Download-Options"
	HeaderXFrameOptions                      = "X-Frame-Options"
	HeaderXPoweredBy                         = "X-Powered-By"
	HeaderXXSSProtection                     = "X-XSS-Protection"
	HeaderLastEventID                        = "Last-Event-ID"
	HeaderNEL                                = "NEL"
	HeaderPingFrom                           = "Ping-From"
	HeaderPingTo                             = "Ping-To"
	HeaderReportTo                           = "Report-To"
	HeaderTE                                 = "TE"
	HeaderTrailer                            = "Trailer"
	HeaderTransferEncoding                   = "Transfer-Encoding"
	HeaderSecWebSocketAccept                 = "Sec-WebSocket-Accept"
	HeaderSecWebSocketExtensions             = "Sec-WebSocket-Extensions"
	HeaderSecWebSocketKey                    = "Sec-WebSocket-Key"
	HeaderSecWebSocketProtocol               = "Sec-WebSocket-Protocol"
	HeaderSecWebSocketVersion                = "Sec-WebSocket-Version"
	HeaderAcceptPatch                        = "Accept-Patch"
	HeaderAcceptPushPolicy                   = "Accept-Push-Policy"
	HeaderAcceptSignature                    = "Accept-Signature"
	HeaderAltSvc                             = "Alt-Svc"
	HeaderDate                               = "Date"
	HeaderIndex                              = "Index"
	HeaderLargeAllocation                    = "Large-Allocation"
	HeaderLink                               = "Link"
	HeaderPushPolicy                         = "Push-Policy"
	HeaderRetryAfter                         = "Retry-After"
	HeaderServerTiming                       = "Server-Timing"
	HeaderSignature                          = "Signature"
	HeaderSignedHeaders                      = "Signed-Headers"
	HeaderSourceMap                          = "SourceMap"
	HeaderUpgrade                            = "Upgrade"
	HeaderXDNSPrefetchControl                = "X-DNS-Prefetch-Control"
	HeaderXPingback                          = "X-Pingback"
	HeaderXRequestID                         = "X-Request-ID"
	HeaderXRequestedWith                     = "X-Requested-With"
	HeaderXRobotsTag                         = "X-Robots-Tag"
	HeaderXUACompatible                      = "X-UA-Compatible"
	HeaderAccessControlAllowPrivateNetwork   = "Access-Control-Allow-Private-Network"
	HeaderAccessControlRequestPrivateNetwork = "Access-Control-Request-Private-Network"
)

HTTP Headers were copied from net/http.

View Source
const (
	CtxKey = "_baa/sgin/ctx"
)

Variables

This section is empty.

Functions

func DefaultErrorHandler

func DefaultErrorHandler(c *Ctx, err error) error

DefaultErrorHandler 默认的错误处理器

func Logger added in v0.0.7

func Logger(c *Ctx)

Logger 返回一个 Gin 中间件,用于打印结构化的 JSON 请求日志。

func Recovery added in v0.0.7

func Recovery(c *Ctx)

Recovery 是一个增强版的错误恢复中间件,它能打印出发生 panic 的具体源代码片段。

func SupportedLanguages added in v0.0.11

func SupportedLanguages() []language.Tag

SupportedLanguages 返回框架支持的所有语言标签

Types

type Body added in v0.0.13

type Body struct {
	// contains filtered or unexported fields
}

Body 表示一个类型化的 HTTP 响应体,用于通过 Send 方法指定响应格式。 应使用 BodyJSON, BodyHTML 等工厂函数构造,而非直接初始化。

func BodyDownload added in v0.0.13

func BodyDownload(data any) Body

func BodyHTML added in v0.0.13

func BodyHTML(name string, data any) Body

func BodyJSON added in v0.0.13

func BodyJSON(data any) Body

func BodyText added in v0.0.13

func BodyText(data any) Body

func BodyUpload added in v0.0.13

func BodyUpload(data any) Body

func BodyXML added in v0.0.13

func BodyXML(data any) Body

type Config

type Config struct {
	Mode           string                      // gin.DebugMode | gin.ReleaseMode | gin.TestMode
	TrustedProxies []string                    // gin.SetTrustedProxies
	Recovery       func(c *Ctx, out, s string) // 回调 [带颜色的输出] 和 [结构化日志]
	ErrorHandler   func(c *Ctx, err error) error
	// 回调 [纯文本] 和 [JSON] 日志,返回 true 输出默认日志到控制台。
	Logger  func(c *Ctx, text string, s string) bool
	OpenAPI *oa.OpenAPI
	Locales []language.Tag // 绑定验证错误所使用的多语言支持
}

type Ctx

type Ctx struct {
	Request *http.Request
	Writer  gin.ResponseWriter
	Params  gin.Params
	Keys    map[string]any
	// contains filtered or unexported fields
}

func (*Ctx) Content added in v0.0.7

func (c *Ctx) Content(value string) *Ctx

func (*Ctx) Cookie

func (c *Ctx) Cookie(name string) (string, error)

func (*Ctx) Get added in v0.0.7

func (c *Ctx) Get(key string, value ...any) any

Get 设置或将值存储到上下文

func (*Ctx) GetHeader added in v0.0.12

func (c *Ctx) GetHeader(key string, value ...string) string

GetHeader 获取 HTTP 请求头的值,如果不存在则返回可选的默认值。

func (*Ctx) Gin added in v0.0.7

func (c *Ctx) Gin() *gin.Context

Gin 返回底层的 *gin.Context

func (*Ctx) Header

func (c *Ctx) Header(key string, value string) *Ctx

func (*Ctx) IP

func (c *Ctx) IP() string

func (*Ctx) Locale added in v0.0.10

func (c *Ctx) Locale() language.Tag

Locale 获取当前请求的语言设置

func (*Ctx) Method

func (c *Ctx) Method() string

func (*Ctx) Next

func (c *Ctx) Next() error

func (*Ctx) Param

func (c *Ctx) Param(key string) string

func (*Ctx) Path

func (c *Ctx) Path(full ...bool) string

Path 返回请求路径 假设请求: /users/123/profile?view=full&name=John%20Doe Path() 返回: "/users/123/profile" Path(true) 返回: "/users/:id/profile"

func (*Ctx) RawBody

func (c *Ctx) RawBody() (body []byte)

func (*Ctx) SaveFile

func (c *Ctx) SaveFile(file *multipart.FileHeader, dst string) error

func (*Ctx) Send

func (c *Ctx) Send(body any) error

func (*Ctx) SetCookie

func (c *Ctx) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)

func (*Ctx) SetLocale added in v0.0.10

func (c *Ctx) SetLocale(locale language.Tag)

SetLocale 设置当前请求的语言

func (*Ctx) Status

func (c *Ctx) Status(code int) *Ctx

func (*Ctx) StatusCode

func (c *Ctx) StatusCode() int

func (*Ctx) TraceID added in v0.0.7

func (c *Ctx) TraceID() string

TraceID 获取请求的 [跟踪ID]

func (*Ctx) Value added in v0.0.7

func (c *Ctx) Value(key string, def ...string) string

Value 获取请求参数

func (*Ctx) ValueAny added in v0.0.7

func (c *Ctx) ValueAny(key string, def ...any) any

ValueAny 获取原始类型的参数值

func (*Ctx) ValueBool added in v0.0.7

func (c *Ctx) ValueBool(key string, def ...any) bool

func (*Ctx) ValueFile added in v0.0.7

func (c *Ctx) ValueFile(key string) (*multipart.FileHeader, error)

ValueFile 获取上传的文件

func (*Ctx) ValueFloat64 added in v0.0.7

func (c *Ctx) ValueFloat64(key string, def ...any) float64

func (*Ctx) ValueInt added in v0.0.7

func (c *Ctx) ValueInt(key string, def ...any) int

func (*Ctx) ValueInt64 added in v0.0.7

func (c *Ctx) ValueInt64(key string, def ...any) int64

func (*Ctx) Values added in v0.0.7

func (c *Ctx) Values() map[string]any

Values 获取所有参数 (Body 覆盖 Query)

type Engine

type Engine struct {
	Router
	// contains filtered or unexported fields
}

func New

func New(config ...Config) *Engine

func (*Engine) Gin added in v0.0.10

func (e *Engine) Gin() *gin.Engine

func (*Engine) Run

func (e *Engine) Run(addr string, certfile ...string) (err error)

Run 将路由器连接到 http.Server 并开始监听和提供 HTTP[S] 请求

提供 cert 和 key 文件路径作为 certfile 参数,可开启 HTTPS 服务。

func (*Engine) RunListener added in v0.0.7

func (e *Engine) RunListener(listener net.Listener) (err error)

RunListener 将路由器连接到 http.Server, 并开始通过指定的 listener 监听和提供 HTTP 请求。

type Error

type Error struct {
	Code    int
	Message string
}

Error 是 APIError 的默认实现

func ErrBadGateway

func ErrBadGateway(msg ...string) *Error

ErrBadGateway 502

func ErrBadRequest

func ErrBadRequest(msg ...string) *Error

ErrBadRequest 400

func ErrConflict

func ErrConflict(msg ...string) *Error

ErrConflict 409

func ErrEntityTooLarge added in v0.0.8

func ErrEntityTooLarge(msg ...string) *Error

ErrEntityTooLarge 413

func ErrExpectationFailed

func ErrExpectationFailed(msg ...string) *Error

ErrExpectationFailed 417

func ErrFailedDependency

func ErrFailedDependency(msg ...string) *Error

ErrFailedDependency 424

func ErrForbidden

func ErrForbidden(msg ...string) *Error

ErrForbidden 403

func ErrGatewayTimeout

func ErrGatewayTimeout(msg ...string) *Error

ErrGatewayTimeout 504

func ErrGone

func ErrGone(msg ...string) *Error

ErrGone 410

func ErrHTTPVersionNotSupported

func ErrHTTPVersionNotSupported(msg ...string) *Error

ErrHTTPVersionNotSupported 505

func ErrHeaderFieldsTooLarge added in v0.0.8

func ErrHeaderFieldsTooLarge(msg ...string) *Error

ErrHeaderFieldsTooLarge 431

func ErrInsufficientStorage

func ErrInsufficientStorage(msg ...string) *Error

ErrInsufficientStorage 507

func ErrInternalServerError

func ErrInternalServerError(msg ...string) *Error

ErrInternalServerError 500

func ErrLengthRequired

func ErrLengthRequired(msg ...string) *Error

ErrLengthRequired 411

func ErrLocked

func ErrLocked(msg ...string) *Error

ErrLocked 423

func ErrLoopDetected

func ErrLoopDetected(msg ...string) *Error

ErrLoopDetected 508

func ErrMethodNotAllowed

func ErrMethodNotAllowed(msg ...string) *Error

ErrMethodNotAllowed 405

func ErrMisdirectedRequest

func ErrMisdirectedRequest(msg ...string) *Error

ErrMisdirectedRequest 421

func ErrNetworkAuthenticationRequired

func ErrNetworkAuthenticationRequired(msg ...string) *Error

ErrNetworkAuthenticationRequired 511

func ErrNotAcceptable

func ErrNotAcceptable(msg ...string) *Error

ErrNotAcceptable 406

func ErrNotExtended

func ErrNotExtended(msg ...string) *Error

ErrNotExtended 510

func ErrNotFound

func ErrNotFound(msg ...string) *Error

ErrNotFound 404

func ErrNotImplemented

func ErrNotImplemented(msg ...string) *Error

ErrNotImplemented 501

func ErrPaymentRequired

func ErrPaymentRequired(msg ...string) *Error

ErrPaymentRequired 402

func ErrPreconditionFailed

func ErrPreconditionFailed(msg ...string) *Error

ErrPreconditionFailed 412

func ErrPreconditionRequired

func ErrPreconditionRequired(msg ...string) *Error

ErrPreconditionRequired 428

func ErrProxyAuthRequired

func ErrProxyAuthRequired(msg ...string) *Error

ErrProxyAuthRequired 407

func ErrRangeNotSatisfiable added in v0.0.8

func ErrRangeNotSatisfiable(msg ...string) *Error

ErrRangeNotSatisfiable 416

func ErrServiceUnavailable

func ErrServiceUnavailable(msg ...string) *Error

ErrServiceUnavailable 503

func ErrTeapot

func ErrTeapot(msg ...string) *Error

ErrTeapot 418

func ErrTimeout added in v0.0.8

func ErrTimeout(msg ...string) *Error

ErrTimeout 408

func ErrTooEarly

func ErrTooEarly(msg ...string) *Error

ErrTooEarly 425

func ErrTooManyRequests

func ErrTooManyRequests(msg ...string) *Error

ErrTooManyRequests 429

func ErrURITooLong added in v0.0.8

func ErrURITooLong(msg ...string) *Error

ErrURITooLong 414

func ErrUnauthorized

func ErrUnauthorized(msg ...string) *Error

ErrUnauthorized 401

func ErrUnavailableForLegalReasons

func ErrUnavailableForLegalReasons(msg ...string) *Error

ErrUnavailableForLegalReasons 451

func ErrUnprocessableEntity

func ErrUnprocessableEntity(msg ...string) *Error

ErrUnprocessableEntity 422

func ErrUnsupportedMediaType

func ErrUnsupportedMediaType(msg ...string) *Error

ErrUnsupportedMediaType 415

func ErrUpgradeRequired

func ErrUpgradeRequired(msg ...string) *Error

ErrUpgradeRequired 426

func ErrVariantAlsoNegotiates

func ErrVariantAlsoNegotiates(msg ...string) *Error

ErrVariantAlsoNegotiates 506

func NewError

func NewError(code int, msg ...string) *Error

NewError 创建一个新的 Error 如果没有提供消息,将使用 http.StatusText(code) 作为默认消息

func NotModified added in v0.0.8

func NotModified(msg ...string) *Error

NotModified 304

func (*Error) Error

func (e *Error) Error() string

type Handler

type Handler any // gin.HandlerFunc, func(*sgin.Ctx[, Input]) T | (T, error)

type IRouter added in v0.0.7

type IRouter interface {
	Use(...Handler) IRouter
	GET(string, ...Handler) IRouter
	POST(string, ...Handler) IRouter
	PUT(string, ...Handler) IRouter
	DELETE(string, ...Handler) IRouter
	Group(string, ...Handler) IRouter
	Handle(method, path string, handlers ...Handler) IRouter
	Static(path, root string) IRouter
}

type RecoverInfo added in v0.0.9

type RecoverInfo struct {
	Time        string   `json:"time"`
	Method      string   `json:"method"`
	Host        string   `json:"host"`
	Path        string   `json:"path"`
	ContentType string   `json:"content"`
	IP          string   `json:"ip"`
	Traceid     string   `json:"traceid"`
	Error       string   `json:"error"`
	Sources     []*Stack `json:"stack"`
}

func (*RecoverInfo) JSON added in v0.0.9

func (r *RecoverInfo) JSON() string

func (*RecoverInfo) String added in v0.0.9

func (r *RecoverInfo) String() string

type Response

type Response struct {
	Event   string `json:"event"`
	Status  int    `json:"status"`
	Code    int    `json:"code"`
	Count   int    `json:"count"`
	Message string `json:"msg"`
	Data    any    `json:"data"`
}

func (*Response) Failed added in v0.0.4

func (r *Response) Failed(data ...any) *Response

Failed 设置失败 (status=0) 数据

func (*Response) OK added in v0.0.4

func (r *Response) OK(data ...any) *Response

OK 设置成功 (status=1) 数据

func (*Response) SetCode

func (r *Response) SetCode(code any) *Response

SetCode 设置 code

func (*Response) SetEvent

func (r *Response) SetEvent(event string) *Response

SetEvent 设置事件

func (*Response) SetMessage

func (r *Response) SetMessage(msg any) *Response

SetMessage 设置消息

func (*Response) SetStatus

func (r *Response) SetStatus(status any, code ...any) *Response

SetStatus 设置 status, code

type Router

type Router struct {
	// contains filtered or unexported fields
}

func (*Router) DELETE added in v0.0.6

func (r *Router) DELETE(path string, handlers ...Handler) IRouter

func (*Router) GET

func (r *Router) GET(path string, handlers ...Handler) IRouter

func (*Router) Group

func (r *Router) Group(path string, handlers ...Handler) IRouter

func (*Router) Handle

func (r *Router) Handle(method, path string, handlers ...Handler) IRouter

func (*Router) POST

func (r *Router) POST(path string, handlers ...Handler) IRouter

func (*Router) PUT added in v0.0.6

func (r *Router) PUT(path string, handlers ...Handler) IRouter

func (*Router) Static

func (r *Router) Static(path, root string) IRouter

func (*Router) Use

func (r *Router) Use(args ...Handler) IRouter

type Stack added in v0.0.9

type Stack struct {
	File   string `json:"file"`
	Line   int    `json:"line"`
	Func   string `json:"func"`
	Source string `json:"source"`
	// contains filtered or unexported fields
}

Stack 存储堆栈的关键信息

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL