gin

package module
v0.0.24 Latest Latest
Warning

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

Go to latest
Published: Mar 18, 2023 License: MIT Imports: 72 Imported by: 0

README

Gin Web Framework

在学习此框架之前,首先你应该会使用gin框架,如果你还没有了解到gin框架,那你应该提前学习一下传送们

扩展gin框架的好处

在常规的开发过程中,会引入很多包,比如 redis、mysql、mongo、kafka 等,单独开发某一个应用进行使用的时候,其实感觉不出痛点,在企业或者一些大型的项目中,都会将某个系统拆分成一些更小的可划分的系统,而我们基本都是负责一个或者某几个项目,这些划分出来的更小单位的系统负责不同的功能,但是其底层的组件肯定都是一致的,比如:mysql、redis、kafka相关的引入代码,但是事实的情况却是就连这些底层的引入实现,每个人都有每个是不同的实现方式。这样就会出现同一个系统的底层基础组件的实现却大相径庭,从而导致项目中的一些业务代码对基础组件的引用也不一样,从而感觉每个服务都有每个服务不一样的写法。

这样的场景在微服务的场景下是十分恶心的,所以针对于gin框架,我做了一些扩展封装,将一些底层的基础组件实现进行统一管理,针对mysql、redis、mongo等都选用了主流的框架,这对于大多数的开发来说都是实用的。

还有一个非常不好的开发习惯,就是很多同学喜欢把项目中的一些基础共用的数据或者配置信息直接在代码里面写死,这个是非常不理智的行为,当出现一些服务环境的之间的切换,数据变更的时候,你需要去频繁修改代码,所以我更建议将一些固定的数据、统一收归到配置文件中去。 实现配置的方式有很多,比如在项目中新建一个配置文件,或者通过mysql、etcd、consul、zk等存储,当然直接使用etcd、consul、zk存储配置也会遇到很多比较麻烦的问题,比如版本切换,不同环境之间的配置值不一致等,你可以直接使用配置中心进行接入解决配置中心(目前内测中)。

基于配置编程

在gin的框架的基础上,我扩展实现了很多组件的封装,比如链路请求,链路追踪,统一配置中心,ip限流,自适应限流,mysql、mongo、redis、rbac等组件的封装,接下来我们开始学习如何使用他们。

快速入门
gin安装
go get -u github.com/limeschool/gin
创建一个配置文件 config/dev.json
{
  "service": "服务名"
}
创建第一个web应用

首先打开你的编辑器,创建一个main.go

package main

import "github.com/limeschool/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run(":8080")
}
运行程序
go run main.go

当然如果你的配置文件不是config/dev.json 这个路径,你也可以在运行时通过参数进行指定。

go run main.go -c config/conf.json
访问web应用

浏览器输入 localhost:8080/ping 你可以看到浏览器输出 pong 。

mysql使用
config/dev.json 配置
{
  "service": "user-center",
  "mysql": [
    {
    "enable":true,
    "name":"ums",
    "dsn": "root:root@tcp(127.0.0.1:3306)/devops_ums?charset=utf8mb4&parseTime=True&loc=Local"
    }
  ]
}
mysql配置解析
参数 说明 类型 是否必填 默认值
enable 是否启用 bool true false
name 数据库标志符,唯一标志数据库 string true -
dsn 连接dsn string true -
conn_max_lifetime 连接最大存活时长 int false 120(秒)
max_open_conn 最大连接数 int false 10
max_idle_conn 最大空闲连接数 int false 5
level 日志等级 1:Silent 2:Error 3:Warn 4:Info int false 4
slow_threshold 慢查询阈值 int false 2(秒)
table_prefix 表前缀 string false -
skip_default_transaction 跳过默认事务 bool false true
singular_table 使用单数表名 bool false true
dry_run 测试生成的 SQL bool false false
prepare_stmt 执行任何 SQL 时都会创建一个 prepared statement 并将其缓存 bool false false
disable_foreign_key GORM 会自动创建外键约束 bool false false
使用示范
package main

import "github.com/limeschool/gin"

func main() {
	e := gin.Default()
	e.GET("/test", func(ctx *gin.Context) {
		db := ctx.Orm("ums")
		// db操作
	})
	e.Run(":8000")
}
快速实现数据的查询

在开发中,我们通常使用结构体来进行参数接收,然后进行数据操作 我们可以在接收的结构体中,定义sql tag 来进行规定数据查询相关的规则,实现快速查询

package main

import (
	"github.com/limeschool/gin"
)

type LoginLogRequest struct {
	Page     int    `json:"page" form:"page" binding:"required" sql:"-"` // - 标识忽略
	Count    int    `json:"count" form:"count"  binding:"required,max=50"  sql:"-"` // - 标识忽略
	Username string `json:"username" form:"username"` // sql 不存在则默认为 username = 参数值
	Status   *bool  `json:"status" form:"status"`
	Start    int64  `json:"start" form:"start" sql:"> ?" field:"created_at"` // created_at > 参数值
	End      int64  `json:"end" form:"end" sql:"< ?" field:"created_at"` // created_at < 参数值
}

type LoginLog struct {
	gin.CreateModel
	Username    string `json:"username"`
	IP          string `json:"ip"`
	Address     string `json:"address"`
	Browser     string `json:"browser"`
	Device      string `json:"device"`
	Status      bool   `json:"status"`
	Description string `json:"description"`
}

func (l LoginLog) Table() string {
	return "login_log"
}

func Page(ctx *gin.Context, page, count int, m interface{}) ([]LoginLog, int64, error) {
	var model LoginLog
	var list []LoginLog
	var total int64
	db := ctx.Orm("ums").Table(model.Table())
	db = gin.GormWhere(db, model.Table(), m) //这里会去反射解析结构体中的sql标签
	if err := db.Count(&total).Error; err != nil {
		return nil, total, err
	}
	return list, total, db.Order("created_at desc").Offset((page - 1) * count).Limit(count).Find(&list).Error
}

func main() {
	en := gin.Default()
	en.Use(gin.ExtCors())
	en.GET("/logs", func(ctx *gin.Context) {
		in := &LoginLogRequest{}
		if err := ctx.ShouldBind(in); err != nil {
			return
		}
		list, _, err := Page(ctx, 1, 10, in)
		if err != nil {
			gin.ResponseError(ctx, err)
		} else {
			gin.ResponseData(ctx, list)
		}
	})

	en.Run(":9001")
}
mongo 使用
config/dev.json 配置
{
  "service": "user-center",
  "mongo": [
    {
    "enable":true,
    "name":"ums",
    "dsn": "root:root@tcp(127.0.0.1:3306)/devops_ums?charset=utf8mb4&parseTime=True&loc=Local"
    }
  ]
}
mongo配置解析
参数 说明 类型 是否必填 默认值
enable 是否启用 bool true false
name 数据库标志符,唯一标志数据库 string true -
dsn 连接dsn string true -
min_pool_size 最小连接数 int false 0
max_pool_size 最大连接数 int true 10
使用示范
package main

import "github.com/limeschool/gin"

func main() {
	e := gin.Default()
	e.GET("/test", func(ctx *gin.Context) {
		db := ctx.Mongo("ums")
		// db操作
	})
	e.Run(":8000")
}
redis 使用
config/dev.json 配置
{
  "service": "user-center",
  "redis": [
    {
    "enable":true,
    "name":"redis",
    }
  ]
}
reid配置解析
参数 说明 类型 是否必填 默认值
enable 是否启用 bool true false
name 数据库标志符,唯一标志数据库 string true -
host 连接地址 string true -
network 网路类型 string false -
username 用户名 string false ""
password 用户密码 string false ""
db 连接指定数据库 int false 0
pool_size 连接池数量 int false cpu核*10
使用示范
package main

import "github.com/limeschool/gin"

func main() {
	e := gin.Default()
	e.GET("/test", func(ctx *gin.Context) {
		redis := ctx.Redis("redis")
		// redis操作
	})
	e.Run(":8000")
}
rsa 使用
config/dev.json 配置
{
  "service": "user-center",
  "rsa": [
    {
    "enable":true,
    "name":"redis",
    "path":"config/private.key",
    }
  ]
}
rsa配置解析
参数 说明 类型 是否必填 默认值
enable 是否启用 bool true false
name 数据库标志符,唯一标志数据库 string true -
path 证书地址 string true -
使用示范
package main

import "github.com/limeschool/gin"

func main() {
	e := gin.Default()
	e.GET("/test", func(ctx *gin.Context) {
		ctx.Rsa("public").Encode("hello world")
		ctx.Rsa("private").Decode("xxx")
	})
	e.Run(":8000")
}
rbac 使用
config/dev.json 配置
{
  "service": "user-center",
  "rbac": [
    {
    "enable":true,
    "db":"ums"
    }
  ]
}
rbac配置解析
参数 说明 类型 是否必填 默认值
enable 是否启用 bool true false
db 数据库标志符,唯一标志数据库,从mysql配置中的name中获取 string true -
使用示范
package main

import "github.com/limeschool/gin"

func main() {
	e := gin.Default()
	e.GET("/test", func(ctx *gin.Context) {
		if is, _ := ctx.Rbac().Enforce("admin", "/test", "GET"); !is {
			ctx.JSON(200,gin.H{"msg":"暂无权限"})
		}else{
		    ctx.JSON(200,gin.H{"msg":"验证通过"})
		}
	})
	e.Run(":8000")
}
request 链路请求使用
config/dev.json 配置
{
  "service": "user-center",
  "request":{
    "enable_log": true,
    "retry_count": 3,
    "retry_wait_time":"1s",
    "timeout": "10s",
    "request_msg": "http request",
    "response_msg": "http response"
  }
}
request配置解析
参数 说明 类型 是否必填 默认值
enable_log 是否启用日志 bool false true
retry_count 请求失败重试次数 int false 3
retry_wait_time 重试等待时长 duration false 2s
max_retry_wait_time 最大重试等待时长 duration false 4s
request_msg 请求数据标识 string false request
response_msg 返回数据标识 string false response
使用示范
package main

import "github.com/limeschool/gin"

func main() {
	e := gin.Default()
	e.GET("/test", func(ctx *gin.Context) {
		var data map[string]interface{}
		request := ctx.Http().Option(func(request *resty.Request) *resty.Request {
			request.Header.Set("Token", "123")
			return request
		}).Get("https://baidu.com")
		if err := request.Result(&data); err != nil {
			fmt.Println(err)
		}
	})
	e.Run(":8000")
}
config 统一配置使用
config/dev.json 配置
{
  "service": "user-center",
  "tx_appid":"xxxx",
  "tx_key":"xxxx"
}
使用示范
package main

import "github.com/limeschool/gin"

func main() {
	e := gin.Default()
	e.GET("/test", func(ctx *gin.Context) {
		appid := ctx.Config.Get("tx_appid")
		fmt.Println(appid)
	})
	e.Run(":8000")
}
链路日志使用
config/dev.json 配置
{
  "service": "user-center",
  "log": {
    "level": 0,
    "trace_key": "log-id",
    "service_key": "service"
  }
}
配置解析
参数 说明 类型 是否必填 默认值
level 日志等级 int false 0
trace_key 链路id的标志符 string false trace-id
service_key 服务名标志符 string false service
使用示范
package main

import "github.com/limeschool/gin"

func main() {
	e := gin.Default()
	e.GET("/test", func(ctx *gin.Context) {
		ctx.Log.Info("hello")
		ctx.Log.Info("hello2")
	})
	e.Run(":8000")
}
系统配置使用
config/dev.json 配置
{
  "service": "user-center",
  "system": {
    "client_timeout":{
      "enable": false,
      "timeout": "10s"
    },
    "client_limit": {
      "enable": true,
      "threshold": 100
    },
    "cpu_threshold": {
      "enable": true,
      "threshold": 900
    }
  }
}
参数 说明 类型 是否必填 默认值
client_timeout 请求超时设置 duration false -
client_limit ip限流 int false -
cpu_threshold cpu自适应降载 取值建议为100-1000 ,建议为900 int false -
使用示范

配置之后自动生效

Documentation

Overview

Package gin implements a HTTP web framework called gin.

See https://gin-gonic.com/ for more information about gin.

Index

Constants

View Source
const (
	MIMEJSON              = binding.MIMEJSON
	MIMEHTML              = binding.MIMEHTML
	MIMEXML               = binding.MIMEXML
	MIMEXML2              = binding.MIMEXML2
	MIMEPlain             = binding.MIMEPlain
	MIMEPOSTForm          = binding.MIMEPOSTForm
	MIMEMultipartPOSTForm = binding.MIMEMultipartPOSTForm
	MIMEYAML              = binding.MIMEYAML
	MIMETOML              = binding.MIMETOML
)

Content-Type MIME of the most common data formats.

View Source
const (
	GetConfigTip = "get config"
	SetConfigTip = "set config"
)
View Source
const (
	SystemMessage = "system"
	GroupMessage  = "group"
	ClientMessage = "client"
	Ping          = "ping"
)
View Source
const (
	// PlatformGoogleAppEngine when running on Google App Engine. Trust X-Appengine-Remote-Addr
	// for determining the client's IP
	PlatformGoogleAppEngine = "X-Appengine-Remote-Addr"
	// PlatformCloudflare when using Cloudflare's CDN. Trust CF-Connecting-IP for determining
	// the client's IP
	PlatformCloudflare = "CF-Connecting-IP"
)

Trusted platforms

View Source
const (
	// DebugMode indicates gin mode is debug.
	DebugMode = "debug"
	// ReleaseMode indicates gin mode is release.
	ReleaseMode = "release"
	// TestMode indicates gin mode is test.
	TestMode = "test"
)
View Source
const AuthUserKey = "user"

AuthUserKey is the cookie name for user credential in basic auth.

View Source
const BindKey = "_gin-gonic/gin/bindkey"

BindKey indicates a default bind key.

View Source
const BodyBytesKey = "_gin-gonic/gin/bodybyteskey"

BodyBytesKey indicates a default body bytes key.

View Source
const ContextKey = "_gin-gonic/gin/contextkey"

ContextKey is the key that a Context returns itself for.

View Source
const EnvGinMode = "GIN_MODE"

EnvGinMode indicates environment name for gin mode.

View Source
const Version = "v1.8.1"

Version is the current gin framework's version.

Variables

View Source
var DebugPrintRouteFunc func(httpMethod, absolutePath, handlerName string, nuHandlers int)

DebugPrintRouteFunc indicates debug log output format.

View Source
var DefaultErrorWriter io.Writer = os.Stderr

DefaultErrorWriter is the default io.Writer used by Gin to debug errors

View Source
var DefaultWriter io.Writer = os.Stdout

DefaultWriter is the default io.Writer used by Gin for debug output and middleware output like Logger() or Recovery(). Note that both Logger and Recovery provides custom ways to configure their output io.Writer. To support coloring in Windows use:

import "github.com/mattn/go-colorable"
gin.DefaultWriter = colorable.NewColorableStdout()
View Source
var ServiceID = "service"
View Source
var TraceID = "trace-id"

Functions

func CreateTestContext

func CreateTestContext(w http.ResponseWriter) (c *Context, r *Engine)

CreateTestContext returns a fresh engine and context for testing purposes

func CustomResponseError added in v0.0.8

func CustomResponseError(ctx *Context, code int, msg string)

func Dir

func Dir(root string, listDirectory bool) http.FileSystem

Dir returns a http.FileSystem that can be used by http.FileServer(). It is used internally in router.Static(). if listDirectory == true, then it works the same as http.Dir() otherwise it returns a filesystem that prevents http.FileServer() to list the directory files.

func DisableBindValidation

func DisableBindValidation()

DisableBindValidation closes the default validator.

func DisableConsoleColor

func DisableConsoleColor()

DisableConsoleColor disables color output in the console.

func DynamicOrmTable added in v0.0.20

func DynamicOrmTable(f func(string) string, baseTable, fieldValue string) func(db *gorm.DB) *gorm.DB

DynamicTable 动态表名

func EnableJsonDecoderDisallowUnknownFields

func EnableJsonDecoderDisallowUnknownFields()

EnableJsonDecoderDisallowUnknownFields sets true for binding.EnableDecoderDisallowUnknownFields to call the DisallowUnknownFields method on the JSON Decoder instance.

func EnableJsonDecoderUseNumber

func EnableJsonDecoderUseNumber()

EnableJsonDecoderUseNumber sets true for binding.EnableDecoderUseNumber to call the UseNumber method on the JSON Decoder instance.

func ExtRecovery added in v0.0.2

func ExtRecovery(ctx *Context)

func ForceConsoleColor

func ForceConsoleColor()

ForceConsoleColor force color output in the console.

func GetDynamicOrmTable added in v0.0.20

func GetDynamicOrmTable(f func(string) string, baseTable, fieldValue string) string

func GormWhere added in v0.0.2

func GormWhere(db *gorm.DB, tb string, val interface{}) *gorm.DB

func Hash16 added in v0.0.20

func Hash16(src string) string

Hash16 用于16张分表

func Hash32 added in v0.0.20

func Hash32(src string) string

Hash32 用于32张分表

func Hash8 added in v0.0.20

func Hash8(src string) string

Hash8 用于8张分表

func IsDebugging

func IsDebugging() bool

IsDebugging returns true if the framework is running in debug mode. Use SetMode(gin.ReleaseMode) to disable debug mode.

func Mode

func Mode() string

Mode returns current gin mode.

func ResponseData added in v0.0.2

func ResponseData(ctx *Context, data interface{})

func ResponseError added in v0.0.2

func ResponseError(ctx *Context, err error)

func ResponseJson added in v0.0.10

func ResponseJson(ctx *Context, data any)

func ResponseList added in v0.0.2

func ResponseList(ctx *Context, page, count, total int, data interface{})

func ResponseXml added in v0.0.10

func ResponseXml(ctx *Context, data any)

func SetMode

func SetMode(value string)

SetMode sets gin mode according to input string.

func SetWatchConfigFunc added in v0.0.20

func SetWatchConfigFunc(f config_drive.CallFunc)

func WatchConfigFunc added in v0.0.20

func WatchConfigFunc(f config_drive.CallFunc)

func WithTraceID added in v0.0.11

func WithTraceID(id string) option

Types

type Accounts

type Accounts map[string]string

Accounts defines a key/value for user/pass list of authorized logins.

type BaseModel added in v0.0.2

type BaseModel struct {
	ID        int64 `json:"id" gorm:"primary_key"`
	CreatedAt int64 `json:"created_at,omitempty" gorm:"index"`
	UpdatedAt int64 `json:"updated_at,omitempty" gorm:"index"`
}

type BroadCastMessageData added in v0.0.20

type BroadCastMessageData struct {
	Message *MessageData
}

BroadCastMessageData 广播发送数据信息

type Client added in v0.0.20

type Client struct {
	Id         string
	Group      string
	Context    context.Context
	CancelFunc context.CancelFunc
	Socket     *websocket.Conn
	Message    chan *MessageData
}

Client 单个 websocket 信息

func (*Client) Read added in v0.0.20

func (c *Client) Read(cxt context.Context)

读信息,从 websocket 连接直接读取数据

func (*Client) Write added in v0.0.20

func (c *Client) Write(cxt context.Context)

写信息,从 channel 变量 Send 中读取数据写入 websocket 连接

type ClientInfo added in v0.0.20

type ClientInfo struct {
	Id    string
	Group string
}

type Config added in v0.0.2

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

func (*Config) Get added in v0.0.2

func (c *Config) Get(key string) interface{}

func (*Config) GetBool added in v0.0.2

func (c *Config) GetBool(key string) bool

func (*Config) GetDefaultDuration added in v0.0.2

func (c *Config) GetDefaultDuration(key string, duration time.Duration) time.Duration

func (*Config) GetDefaultFloat64 added in v0.0.2

func (c *Config) GetDefaultFloat64(key string, def float64) float64

func (*Config) GetDefaultInt added in v0.0.2

func (c *Config) GetDefaultInt(key string, def int) int

func (*Config) GetDefaultString added in v0.0.2

func (c *Config) GetDefaultString(key string, def string) string

func (*Config) GetDuration added in v0.0.2

func (c *Config) GetDuration(key string) time.Duration

func (*Config) GetFloat64 added in v0.0.2

func (c *Config) GetFloat64(key string) float64

func (*Config) GetInt added in v0.0.2

func (c *Config) GetInt(key string) int

func (*Config) GetInt32 added in v0.0.2

func (c *Config) GetInt32(key string) int32

func (*Config) GetInt64 added in v0.0.2

func (c *Config) GetInt64(key string) int64

func (*Config) GetIntSlice added in v0.0.2

func (c *Config) GetIntSlice(key string) []int

func (*Config) GetString added in v0.0.2

func (c *Config) GetString(key string) string

func (*Config) GetStringMap added in v0.0.2

func (c *Config) GetStringMap(key string) map[string]interface{}

func (*Config) GetStringMapString added in v0.0.2

func (c *Config) GetStringMapString(key string) map[string]string

func (*Config) GetStringMapStringSlice added in v0.0.2

func (c *Config) GetStringMapStringSlice(key string) map[string][]string

func (*Config) GetStringSlice added in v0.0.2

func (c *Config) GetStringSlice(key string) []string

func (*Config) GetTime added in v0.0.2

func (c *Config) GetTime(key string) time.Time

func (*Config) GetUint added in v0.0.2

func (c *Config) GetUint(key string) uint

func (*Config) GetUint32 added in v0.0.2

func (c *Config) GetUint32(key string) uint32

func (*Config) GetUint64 added in v0.0.2

func (c *Config) GetUint64(key string) uint64

func (*Config) Set added in v0.0.2

func (c *Config) Set(key string, value interface{})

func (*Config) Unmarshal added in v0.0.2

func (c *Config) Unmarshal(val interface{}) error

func (*Config) UnmarshalKey added in v0.0.2

func (c *Config) UnmarshalKey(key string, val interface{}) error

type Context

type Context struct {
	Request *http.Request
	Writer  ResponseWriter

	Params Params

	// Keys is a key/value pair exclusively for the context of each request.
	Keys map[string]any

	// Errors is a list of errors attached to all the handlers/middlewares who used this context.
	Errors errorMsgs

	// Accepted defines a list of manually accepted formats for content negotiation.
	Accepted []string

	// Ext
	// config center
	Config IConfig
	// log
	Log *zap.Logger
	// trace-id
	TraceID string
	// server_name 服务名
	ServiceName string
	// contains filtered or unexported fields
}

Context is the most important part of gin. It allows us to pass variables between middleware, manage the flow, validate the JSON of a request and render a JSON response for example.

func NewContext added in v0.0.2

func NewContext(opts ...option) *Context

func (*Context) Abort

func (c *Context) Abort()

Abort prevents pending handlers from being called. Note that this will not stop the current handler. Let's say you have an authorization middleware that validates that the current request is authorized. If the authorization fails (ex: the password does not match), call Abort to ensure the remaining handlers for this request are not called.

func (*Context) AbortWithError

func (c *Context) AbortWithError(code int, err error) *Error

AbortWithError calls `AbortWithStatus()` and `Error()` internally. This method stops the chain, writes the status code and pushes the specified error to `c.Errors`. See Context.Error() for more details.

func (*Context) AbortWithStatus

func (c *Context) AbortWithStatus(code int)

AbortWithStatus calls `Abort()` and writes the headers with the specified status code. For example, a failed attempt to authenticate a request could use: context.AbortWithStatus(401).

func (*Context) AbortWithStatusJSON

func (c *Context) AbortWithStatusJSON(code int, jsonObj any)

AbortWithStatusJSON calls `Abort()` and then `JSON` internally. This method stops the chain, writes the status code and return a JSON body. It also sets the Content-Type as "application/json".

func (*Context) AddParam

func (c *Context) AddParam(key, value string)

AddParam adds param to context and replaces path param key with given value for e2e testing purposes Example Route: "/user/:id" AddParam("id", 1) Result: "/user/1"

func (*Context) AsciiJSON

func (c *Context) AsciiJSON(code int, obj any)

AsciiJSON serializes the given struct as JSON into the response body with unicode to ASCII string. It also sets the Content-Type as "application/json".

func (*Context) Bind

func (c *Context) Bind(obj any) error

Bind checks the Method and Content-Type to select a binding engine automatically, Depending on the "Content-Type" header different bindings are used, for example:

"application/json" --> JSON binding
"application/xml"  --> XML binding

It parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input. It decodes the json payload into the struct specified as a pointer. It writes a 400 error and sets Content-Type header "text/plain" in the response if input is not valid.

func (*Context) BindHeader

func (c *Context) BindHeader(obj any) error

BindHeader is a shortcut for c.MustBindWith(obj, binding.Header).

func (*Context) BindJSON

func (c *Context) BindJSON(obj any) error

BindJSON is a shortcut for c.MustBindWith(obj, binding.JSON).

func (*Context) BindQuery

func (c *Context) BindQuery(obj any) error

BindQuery is a shortcut for c.MustBindWith(obj, binding.Query).

func (*Context) BindTOML

func (c *Context) BindTOML(obj interface{}) error

BindTOML is a shortcut for c.MustBindWith(obj, binding.TOML).

func (*Context) BindUri

func (c *Context) BindUri(obj any) error

BindUri binds the passed struct pointer using binding.Uri. It will abort the request with HTTP 400 if any error occurs.

func (*Context) BindWith

func (c *Context) BindWith(obj any, b binding.Binding) error

BindWith binds the passed struct pointer using the specified binding engine. See the binding package.

func (*Context) BindXML

func (c *Context) BindXML(obj any) error

BindXML is a shortcut for c.MustBindWith(obj, binding.BindXML).

func (*Context) BindYAML

func (c *Context) BindYAML(obj any) error

BindYAML is a shortcut for c.MustBindWith(obj, binding.YAML).

func (*Context) ClientIP

func (c *Context) ClientIP() string

ClientIP implements one best effort algorithm to return the real client IP. It calls c.RemoteIP() under the hood, to check if the remote IP is a trusted proxy or not. If it is it will then try to parse the headers defined in Engine.RemoteIPHeaders (defaulting to [X-Forwarded-For, X-Real-Ip]). If the headers are not syntactically valid OR the remote IP does not correspond to a trusted proxy, the remote IP (coming from Request.RemoteAddr) is returned.

func (*Context) ContentType

func (c *Context) ContentType() string

ContentType returns the Content-Type header of the request.

func (*Context) Context added in v0.0.2

func (c *Context) Context() context.Context

func (*Context) Cookie

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

Cookie returns the named cookie provided in the request or ErrNoCookie if not found. And return the named cookie is unescaped. If multiple cookies match the given name, only one cookie will be returned.

func (*Context) Copy

func (c *Context) Copy() *Context

Copy returns a copy of the current context that can be safely used outside the request's scope. This has to be used when the context has to be passed to a goroutine.

func (*Context) Data

func (c *Context) Data(code int, contentType string, data []byte)

Data writes some data into the body stream and updates the HTTP code.

func (*Context) DataFromReader

func (c *Context) DataFromReader(code int, contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string)

DataFromReader writes the specified reader into the body stream and updates the HTTP code.

func (*Context) Deadline

func (c *Context) Deadline() (deadline time.Time, ok bool)

Deadline returns that there is no deadline (ok==false) when c.Request has no Context.

func (*Context) DefaultPostForm

func (c *Context) DefaultPostForm(key, defaultValue string) string

DefaultPostForm returns the specified key from a POST urlencoded form or multipart form when it exists, otherwise it returns the specified defaultValue string. See: PostForm() and GetPostForm() for further information.

func (*Context) DefaultQuery

func (c *Context) DefaultQuery(key, defaultValue string) string

DefaultQuery returns the keyed url query value if it exists, otherwise it returns the specified defaultValue string. See: Query() and GetQuery() for further information.

GET /?name=Manu&lastname=
c.DefaultQuery("name", "unknown") == "Manu"
c.DefaultQuery("id", "none") == "none"
c.DefaultQuery("lastname", "none") == ""

func (*Context) Done

func (c *Context) Done() <-chan struct{}

Done returns nil (chan which will wait forever) when c.Request has no Context.

func (*Context) Err

func (c *Context) Err() error

Err returns nil when c.Request has no Context.

func (*Context) Error

func (c *Context) Error(err error) *Error

Error attaches an error to the current context. The error is pushed to a list of errors. It's a good idea to call Error for each error that occurred during the resolution of a request. A middleware can be used to collect all the errors and push them to a database together, print a log, or append it in the HTTP response. Error will panic if err is nil.

func (*Context) File

func (c *Context) File(filepath string)

File writes the specified file into the body stream in an efficient way.

func (*Context) FileAttachment

func (c *Context) FileAttachment(filepath, filename string)

FileAttachment writes the specified file into the body stream in an efficient way On the client side, the file will typically be downloaded with the given filename

func (*Context) FileFromFS

func (c *Context) FileFromFS(filepath string, fs http.FileSystem)

FileFromFS writes the specified file from http.FileSystem into the body stream in an efficient way.

func (*Context) FormFile

func (c *Context) FormFile(name string) (*multipart.FileHeader, error)

FormFile returns the first file for the provided form key.

func (*Context) FullPath

func (c *Context) FullPath() string

FullPath returns a matched route full path. For not found routes returns an empty string.

router.GET("/user/:id", func(c *gin.Context) {
    c.FullPath() == "/user/:id" // true
})

func (*Context) Get

func (c *Context) Get(key string) (value any, exists bool)

Get returns the value for the given key, ie: (value, true). If the value does not exist it returns (nil, false)

func (*Context) GetBool

func (c *Context) GetBool(key string) (b bool)

GetBool returns the value associated with the key as a boolean.

func (*Context) GetDuration

func (c *Context) GetDuration(key string) (d time.Duration)

GetDuration returns the value associated with the key as a duration.

func (*Context) GetFloat64

func (c *Context) GetFloat64(key string) (f64 float64)

GetFloat64 returns the value associated with the key as a float64.

func (*Context) GetHeader

func (c *Context) GetHeader(key string) string

GetHeader returns value from request headers.

func (*Context) GetInt

func (c *Context) GetInt(key string) (i int)

GetInt returns the value associated with the key as an integer.

func (*Context) GetInt64

func (c *Context) GetInt64(key string) (i64 int64)

GetInt64 returns the value associated with the key as an integer.

func (*Context) GetPostForm

func (c *Context) GetPostForm(key string) (string, bool)

GetPostForm is like PostForm(key). It returns the specified key from a POST urlencoded form or multipart form when it exists `(value, true)` (even when the value is an empty string), otherwise it returns ("", false). For example, during a PATCH request to update the user's email:

    email=mail@example.com  -->  ("mail@example.com", true) := GetPostForm("email") // set email to "mail@example.com"
	   email=                  -->  ("", true) := GetPostForm("email") // set email to ""
                            -->  ("", false) := GetPostForm("email") // do nothing with email

func (*Context) GetPostFormArray

func (c *Context) GetPostFormArray(key string) (values []string, ok bool)

GetPostFormArray returns a slice of strings for a given form key, plus a boolean value whether at least one value exists for the given key.

func (*Context) GetPostFormMap

func (c *Context) GetPostFormMap(key string) (map[string]string, bool)

GetPostFormMap returns a map for a given form key, plus a boolean value whether at least one value exists for the given key.

func (*Context) GetQuery

func (c *Context) GetQuery(key string) (string, bool)

GetQuery is like Query(), it returns the keyed url query value if it exists `(value, true)` (even when the value is an empty string), otherwise it returns `("", false)`. It is shortcut for `c.Request.URL.Query().Get(key)`

GET /?name=Manu&lastname=
("Manu", true) == c.GetQuery("name")
("", false) == c.GetQuery("id")
("", true) == c.GetQuery("lastname")

func (*Context) GetQueryArray

func (c *Context) GetQueryArray(key string) (values []string, ok bool)

GetQueryArray returns a slice of strings for a given query key, plus a boolean value whether at least one value exists for the given key.

func (*Context) GetQueryMap

func (c *Context) GetQueryMap(key string) (map[string]string, bool)

GetQueryMap returns a map for a given query key, plus a boolean value whether at least one value exists for the given key.

func (*Context) GetRawData

func (c *Context) GetRawData() ([]byte, error)

GetRawData returns stream data.

func (*Context) GetString

func (c *Context) GetString(key string) (s string)

GetString returns the value associated with the key as a string.

func (*Context) GetStringMap

func (c *Context) GetStringMap(key string) (sm map[string]any)

GetStringMap returns the value associated with the key as a map of interfaces.

func (*Context) GetStringMapString

func (c *Context) GetStringMapString(key string) (sms map[string]string)

GetStringMapString returns the value associated with the key as a map of strings.

func (*Context) GetStringMapStringSlice

func (c *Context) GetStringMapStringSlice(key string) (smss map[string][]string)

GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings.

func (*Context) GetStringSlice

func (c *Context) GetStringSlice(key string) (ss []string)

GetStringSlice returns the value associated with the key as a slice of strings.

func (*Context) GetTime

func (c *Context) GetTime(key string) (t time.Time)

GetTime returns the value associated with the key as time.

func (*Context) GetUint

func (c *Context) GetUint(key string) (ui uint)

GetUint returns the value associated with the key as an unsigned integer.

func (*Context) GetUint64

func (c *Context) GetUint64(key string) (ui64 uint64)

GetUint64 returns the value associated with the key as an unsigned integer.

func (*Context) HTML

func (c *Context) HTML(code int, name string, obj any)

HTML renders the HTTP template specified by its file name. It also updates the HTTP code and sets the Content-Type as "text/html". See http://golang.org/doc/articles/wiki/

func (*Context) Handler

func (c *Context) Handler() HandlerFunc

Handler returns the main handler.

func (*Context) HandlerName

func (c *Context) HandlerName() string

HandlerName returns the main handler's name. For example if the handler is "handleGetUsers()", this function will return "main.handleGetUsers".

func (*Context) HandlerNames

func (c *Context) HandlerNames() []string

HandlerNames returns a list of all registered handlers for this context in descending order, following the semantics of HandlerName()

func (*Context) Header

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

Header is an intelligent shortcut for c.Writer.Header().Set(key, value). It writes a header in the response. If value == "", this method removes the header `c.Writer.Header().Del(key)`

func (*Context) Http added in v0.0.3

func (c *Context) Http() *request

func (*Context) IndentedJSON

func (c *Context) IndentedJSON(code int, obj any)

IndentedJSON serializes the given struct as pretty JSON (indented + endlines) into the response body. It also sets the Content-Type as "application/json". WARNING: we recommend using this only for development purposes since printing pretty JSON is more CPU and bandwidth consuming. Use Context.JSON() instead.

func (*Context) IsAborted

func (c *Context) IsAborted() bool

IsAborted returns true if the current context was aborted.

func (*Context) IsWebsocket

func (c *Context) IsWebsocket() bool

IsWebsocket returns true if the request headers indicate that a websocket handshake is being initiated by the client.

func (*Context) JSON

func (c *Context) JSON(code int, obj any)

JSON serializes the given struct as JSON into the response body. It also sets the Content-Type as "application/json".

func (*Context) JSONP

func (c *Context) JSONP(code int, obj any)

JSONP serializes the given struct as JSON into the response body. It adds padding to response body to request data from a server residing in a different domain than the client. It also sets the Content-Type as "application/javascript".

func (*Context) Mongo added in v0.0.2

func (c *Context) Mongo(name string) *mongo.Client

func (*Context) MultipartForm

func (c *Context) MultipartForm() (*multipart.Form, error)

MultipartForm is the parsed multipart form, including file uploads.

func (*Context) MustBindWith

func (c *Context) MustBindWith(obj any, b binding.Binding) error

MustBindWith binds the passed struct pointer using the specified binding engine. It will abort the request with HTTP 400 if any error occurs. See the binding package.

func (*Context) MustGet

func (c *Context) MustGet(key string) any

MustGet returns the value for the given key if it exists, otherwise it panics.

func (*Context) Negotiate

func (c *Context) Negotiate(code int, config Negotiate)

Negotiate calls different Render according to acceptable Accept format.

func (*Context) NegotiateFormat

func (c *Context) NegotiateFormat(offered ...string) string

NegotiateFormat returns an acceptable Accept format.

func (*Context) Next

func (c *Context) Next()

Next should be used only inside middleware. It executes the pending handlers in the chain inside the calling handler. See example in GitHub.

func (*Context) Orm added in v0.0.20

func (c *Context) Orm(name string) *gorm.DB

func (*Context) Param

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

Param returns the value of the URL param. It is a shortcut for c.Params.ByName(key)

router.GET("/user/:id", func(c *gin.Context) {
    // a GET request to /user/john
    id := c.Param("id") // id == "john"
})

func (*Context) PostForm

func (c *Context) PostForm(key string) (value string)

PostForm returns the specified key from a POST urlencoded form or multipart form when it exists, otherwise it returns an empty string `("")`.

func (*Context) PostFormArray

func (c *Context) PostFormArray(key string) (values []string)

PostFormArray returns a slice of strings for a given form key. The length of the slice depends on the number of params with the given key.

func (*Context) PostFormMap

func (c *Context) PostFormMap(key string) (dicts map[string]string)

PostFormMap returns a map for a given form key.

func (*Context) ProtoBuf

func (c *Context) ProtoBuf(code int, obj any)

ProtoBuf serializes the given struct as ProtoBuf into the response body.

func (*Context) PureJSON

func (c *Context) PureJSON(code int, obj any)

PureJSON serializes the given struct as JSON into the response body. PureJSON, unlike JSON, does not replace special html characters with their unicode entities.

func (*Context) Query

func (c *Context) Query(key string) (value string)

Query returns the keyed url query value if it exists, otherwise it returns an empty string `("")`. It is shortcut for `c.Request.URL.Query().Get(key)`

    GET /path?id=1234&name=Manu&value=
	   c.Query("id") == "1234"
	   c.Query("name") == "Manu"
	   c.Query("value") == ""
	   c.Query("wtf") == ""

func (*Context) QueryArray

func (c *Context) QueryArray(key string) (values []string)

QueryArray returns a slice of strings for a given query key. The length of the slice depends on the number of params with the given key.

func (*Context) QueryMap

func (c *Context) QueryMap(key string) (dicts map[string]string)

QueryMap returns a map for a given query key.

func (*Context) Rbac added in v0.0.2

func (c *Context) Rbac() RbacInterface

func (*Context) Redirect

func (c *Context) Redirect(code int, location string)

Redirect returns an HTTP redirect to the specific location.

func (*Context) Redis added in v0.0.2

func (c *Context) Redis(name string) *redis.Client

func (*Context) RemoteIP

func (c *Context) RemoteIP() string

RemoteIP parses the IP from Request.RemoteAddr, normalizes and returns the IP (without the port).

func (*Context) Render

func (c *Context) Render(code int, r render.Render)

Render writes the response headers and calls render.Render to render data.

func (*Context) RespData added in v0.0.2

func (c *Context) RespData(data interface{})

func (*Context) RespError added in v0.0.2

func (c *Context) RespError(err error)

func (*Context) RespJson added in v0.0.10

func (c *Context) RespJson(data interface{})

func (*Context) RespList added in v0.0.2

func (c *Context) RespList(page, count, total int, data interface{})

func (*Context) RespSuccess added in v0.0.2

func (c *Context) RespSuccess()

func (*Context) RespXml added in v0.0.10

func (c *Context) RespXml(data interface{})

func (*Context) Rsa added in v0.0.2

func (c *Context) Rsa(name string) *ExtRsa

func (*Context) SSEvent

func (c *Context) SSEvent(name string, message any)

SSEvent writes a Server-Sent Event into the body stream.

func (*Context) SaveUploadedFile

func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error

SaveUploadedFile uploads the form file to specific dst.

func (*Context) SecureJSON

func (c *Context) SecureJSON(code int, obj any)

SecureJSON serializes the given struct as Secure JSON into the response body. Default prepends "while(1)," to response body if the given struct is array values. It also sets the Content-Type as "application/json".

func (*Context) Set

func (c *Context) Set(key string, value any)

Set is used to store a new key/value pair exclusively for this context. It also lazy initializes c.Keys if it was not used previously.

func (*Context) SetAccepted

func (c *Context) SetAccepted(formats ...string)

SetAccepted sets Accept header data.

func (*Context) SetCookie

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

SetCookie adds a Set-Cookie header to the ResponseWriter's headers. The provided cookie must have a valid Name. Invalid cookies may be silently dropped.

func (*Context) SetSameSite

func (c *Context) SetSameSite(samesite http.SameSite)

SetSameSite with cookie

func (*Context) ShouldBind

func (c *Context) ShouldBind(obj any) error

ShouldBind checks the Method and Content-Type to select a binding engine automatically, Depending on the "Content-Type" header different bindings are used, for example:

"application/json" --> JSON binding
"application/xml"  --> XML binding

It parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input. It decodes the json payload into the struct specified as a pointer. Like c.Bind() but this method does not set the response status code to 400 or abort if input is not valid.

func (*Context) ShouldBindBodyWith

func (c *Context) ShouldBindBodyWith(obj any, bb binding.BindingBody) (err error)

ShouldBindBodyWith is similar with ShouldBindWith, but it stores the request body into the context, and reuse when it is called again.

NOTE: This method reads the body before binding. So you should use ShouldBindWith for better performance if you need to call only once.

func (*Context) ShouldBindHeader

func (c *Context) ShouldBindHeader(obj any) error

ShouldBindHeader is a shortcut for c.ShouldBindWith(obj, binding.Header).

func (*Context) ShouldBindJSON

func (c *Context) ShouldBindJSON(obj any) error

ShouldBindJSON is a shortcut for c.ShouldBindWith(obj, binding.JSON).

func (*Context) ShouldBindQuery

func (c *Context) ShouldBindQuery(obj any) error

ShouldBindQuery is a shortcut for c.ShouldBindWith(obj, binding.Query).

func (*Context) ShouldBindTOML

func (c *Context) ShouldBindTOML(obj interface{}) error

ShouldBindTOML is a shortcut for c.ShouldBindWith(obj, binding.TOML).

func (*Context) ShouldBindUri

func (c *Context) ShouldBindUri(obj any) error

ShouldBindUri binds the passed struct pointer using the specified binding engine.

func (*Context) ShouldBindWith

func (c *Context) ShouldBindWith(obj any, b binding.Binding) error

ShouldBindWith binds the passed struct pointer using the specified binding engine. See the binding package.

func (*Context) ShouldBindXML

func (c *Context) ShouldBindXML(obj any) error

ShouldBindXML is a shortcut for c.ShouldBindWith(obj, binding.XML).

func (*Context) ShouldBindYAML

func (c *Context) ShouldBindYAML(obj any) error

ShouldBindYAML is a shortcut for c.ShouldBindWith(obj, binding.YAML).

func (*Context) Status

func (c *Context) Status(code int)

Status sets the HTTP response code.

func (*Context) Stream

func (c *Context) Stream(step func(w io.Writer) bool) bool

Stream sends a streaming response and returns a boolean indicates "Is client disconnected in middle of stream"

func (*Context) String

func (c *Context) String(code int, format string, values ...any)

String writes the given string into the response body.

func (*Context) TOML

func (c *Context) TOML(code int, obj interface{})

TOML serializes the given struct as TOML into the response body.

func (*Context) Value

func (c *Context) Value(key any) any

Value returns the value associated with this context for key, or nil if no value is associated with key. Successive calls to Value with the same key returns the same result.

func (*Context) XML

func (c *Context) XML(code int, obj any)

XML serializes the given struct as XML into the response body. It also sets the Content-Type as "application/xml".

func (*Context) YAML

func (c *Context) YAML(code int, obj any)

YAML serializes the given struct as YAML into the response body.

type CreateModel added in v0.0.2

type CreateModel struct {
	ID        int64 `json:"id" gorm:"primary_key"`
	CreatedAt int64 `json:"created_at,omitempty" gorm:"index"`
}

type CustomError added in v0.0.2

type CustomError struct {
	Code    int    `json:"code"`
	Msg     string `json:"msg"`
	TraceID string `json:"TraceId"`
}

func (*CustomError) Error added in v0.0.2

func (c *CustomError) Error() string

type DeleteModel added in v0.0.2

type DeleteModel struct {
	ID        int64          `json:"id" gorm:"primary_key"`
	CreatedAt int64          `json:"created_at,omitempty" gorm:"index"`
	UpdatedAt int64          `json:"updated_at,omitempty" gorm:"index"`
	DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}

type Engine

type Engine struct {
	RouterGroup

	// RedirectTrailingSlash enables automatic redirection if the current route can't be matched but a
	// handler for the path with (without) the trailing slash exists.
	// For example if /foo/ is requested but a route only exists for /foo, the
	// client is redirected to /foo with http status code 301 for GET requests
	// and 307 for all other request methods.
	RedirectTrailingSlash bool

	// RedirectFixedPath if enabled, the router tries to fix the current request path, if no
	// handle is registered for it.
	// First superfluous path elements like ../ or // are removed.
	// Afterwards the router does a case-insensitive lookup of the cleaned path.
	// If a handle can be found for this route, the router makes a redirection
	// to the corrected path with status code 301 for GET requests and 307 for
	// all other request methods.
	// For example /FOO and /..//Foo could be redirected to /foo.
	// RedirectTrailingSlash is independent of this option.
	RedirectFixedPath bool

	// HandleMethodNotAllowed if enabled, the router checks if another method is allowed for the
	// current route, if the current request can not be routed.
	// If this is the case, the request is answered with 'Method Not Allowed'
	// and HTTP status code 405.
	// If no other Method is allowed, the request is delegated to the NotFound
	// handler.
	HandleMethodNotAllowed bool

	// ForwardedByClientIP if enabled, client IP will be parsed from the request's headers that
	// match those stored at `(*gin.Engine).RemoteIPHeaders`. If no IP was
	// fetched, it falls back to the IP obtained from
	// `(*gin.Context).Request.RemoteAddr`.
	ForwardedByClientIP bool

	// AppEngine was deprecated.
	// Deprecated: USE `TrustedPlatform` WITH VALUE `gin.PlatformGoogleAppEngine` INSTEAD
	// #726 #755 If enabled, it will trust some headers starting with
	// 'X-AppEngine...' for better integration with that PaaS.
	AppEngine bool

	// UseRawPath if enabled, the url.RawPath will be used to find parameters.
	UseRawPath bool

	// UnescapePathValues if true, the path value will be unescaped.
	// If UseRawPath is false (by default), the UnescapePathValues effectively is true,
	// as url.Path gonna be used, which is already unescaped.
	UnescapePathValues bool

	// RemoveExtraSlash a parameter can be parsed from the URL even with extra slashes.
	// See the PR #1817 and issue #1644
	RemoveExtraSlash bool

	// RemoteIPHeaders list of headers used to obtain the client IP when
	// `(*gin.Engine).ForwardedByClientIP` is `true` and
	// `(*gin.Context).Request.RemoteAddr` is matched by at least one of the
	// network origins of list defined by `(*gin.Engine).SetTrustedProxies()`.
	RemoteIPHeaders []string

	// TrustedPlatform if set to a constant of value gin.Platform*, trusts the headers set by
	// that platform, for example to determine the client IP
	TrustedPlatform string

	// MaxMultipartMemory value of 'maxMemory' param that is given to http.Request's ParseMultipartForm
	// method call.
	MaxMultipartMemory int64

	// UseH2C enable h2c support.
	UseH2C bool

	// ContextWithFallback enable fallback Context.Deadline(), Context.Done(), Context.Err() and Context.Value() when Context.Request.Context() is not nil.
	ContextWithFallback bool

	HTMLRender render.HTMLRender
	FuncMap    template.FuncMap
	// contains filtered or unexported fields
}

Engine is the framework's instance, it contains the muxer, middleware and configuration settings. Create an instance of Engine, by using New() or Default()

func Default

func Default() *Engine

Default returns an Engine instance with the Logger and Recovery middleware already attached.

func New

func New() *Engine

New returns a new blank Engine instance without any middleware attached. By default, the configuration is: - RedirectTrailingSlash: true - RedirectFixedPath: false - HandleMethodNotAllowed: false - ForwardedByClientIP: true - UseRawPath: false - UnescapePathValues: true

func (*Engine) Delims

func (engine *Engine) Delims(left, right string) *Engine

Delims sets template left and right delims and returns an Engine instance.

func (*Engine) HandleContext

func (engine *Engine) HandleContext(c *Context)

HandleContext re-enters a context that has been rewritten. This can be done by setting c.Request.URL.Path to your new target. Disclaimer: You can loop yourself to deal with this, use wisely.

func (*Engine) Handler

func (engine *Engine) Handler() http.Handler

func (*Engine) LoadHTMLFiles

func (engine *Engine) LoadHTMLFiles(files ...string)

LoadHTMLFiles loads a slice of HTML files and associates the result with HTML renderer.

func (*Engine) LoadHTMLGlob

func (engine *Engine) LoadHTMLGlob(pattern string)

LoadHTMLGlob loads HTML files identified by glob pattern and associates the result with HTML renderer.

func (*Engine) NoMethod

func (engine *Engine) NoMethod(handlers ...HandlerFunc)

NoMethod sets the handlers called when Engine.HandleMethodNotAllowed = true.

func (*Engine) NoRoute

func (engine *Engine) NoRoute(handlers ...HandlerFunc)

NoRoute adds handlers for NoRoute. It returns a 404 code by default.

func (*Engine) Routes

func (engine *Engine) Routes() (routes RoutesInfo)

Routes returns a slice of registered routes, including some useful information, such as: the http method, path and the handler name.

func (*Engine) Run

func (engine *Engine) Run(addr ...string) (err error)

Run attaches the router to a http.Server and starts listening and serving HTTP requests. It is a shortcut for http.ListenAndServe(addr, router) Note: this method will block the calling goroutine indefinitely unless an error happens.

func (*Engine) RunFd

func (engine *Engine) RunFd(fd int) (err error)

RunFd attaches the router to a http.Server and starts listening and serving HTTP requests through the specified file descriptor. Note: this method will block the calling goroutine indefinitely unless an error happens.

func (*Engine) RunListener

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

RunListener attaches the router to a http.Server and starts listening and serving HTTP requests through the specified net.Listener

func (*Engine) RunTLS

func (engine *Engine) RunTLS(addr, certFile, keyFile string) (err error)

RunTLS attaches the router to a http.Server and starts listening and serving HTTPS (secure) requests. It is a shortcut for http.ListenAndServeTLS(addr, certFile, keyFile, router) Note: this method will block the calling goroutine indefinitely unless an error happens.

func (*Engine) RunUnix

func (engine *Engine) RunUnix(file string) (err error)

RunUnix attaches the router to a http.Server and starts listening and serving HTTP requests through the specified unix socket (i.e. a file). Note: this method will block the calling goroutine indefinitely unless an error happens.

func (*Engine) SecureJsonPrefix

func (engine *Engine) SecureJsonPrefix(prefix string) *Engine

SecureJsonPrefix sets the secureJSONPrefix used in Context.SecureJSON.

func (*Engine) ServeHTTP

func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request)

ServeHTTP conforms to the http.Handler interface.

func (*Engine) SetFuncMap

func (engine *Engine) SetFuncMap(funcMap template.FuncMap)

SetFuncMap sets the FuncMap used for template.FuncMap.

func (*Engine) SetHTMLTemplate

func (engine *Engine) SetHTMLTemplate(templ *template.Template)

SetHTMLTemplate associate a template with HTML renderer.

func (*Engine) SetTrustedProxies

func (engine *Engine) SetTrustedProxies(trustedProxies []string) error

SetTrustedProxies set a list of network origins (IPv4 addresses, IPv4 CIDRs, IPv6 addresses or IPv6 CIDRs) from which to trust request's headers that contain alternative client IP when `(*gin.Engine).ForwardedByClientIP` is `true`. `TrustedProxies` feature is enabled by default, and it also trusts all proxies by default. If you want to disable this feature, use Engine.SetTrustedProxies(nil), then Context.ClientIP() will return the remote address directly.

func (*Engine) Use

func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes

Use attaches a global middleware to the router. i.e. the middleware attached through Use() will be included in the handlers chain for every single request. Even 404, 405, static files... For example, this is the right place for a logger or error management middleware.

type Error

type Error struct {
	Err  error
	Type ErrorType
	Meta any
}

Error represents a error's specification.

func (Error) Error

func (msg Error) Error() string

Error implements the error interface.

func (*Error) IsType

func (msg *Error) IsType(flags ErrorType) bool

IsType judges one error.

func (*Error) JSON

func (msg *Error) JSON() any

JSON creates a properly formatted JSON

func (*Error) MarshalJSON

func (msg *Error) MarshalJSON() ([]byte, error)

MarshalJSON implements the json.Marshaller interface.

func (*Error) SetMeta

func (msg *Error) SetMeta(data any) *Error

SetMeta sets the error's meta data.

func (*Error) SetType

func (msg *Error) SetType(flags ErrorType) *Error

SetType sets the error's type.

func (*Error) Unwrap

func (msg *Error) Unwrap() error

Unwrap returns the wrapped error, to allow interoperability with errors.Is(), errors.As() and errors.Unwrap()

type ErrorType

type ErrorType uint64

ErrorType is an unsigned 64-bit error code as defined in the gin spec.

const (
	// ErrorTypeBind is used when Context.Bind() fails.
	ErrorTypeBind ErrorType = 1 << 63
	// ErrorTypeRender is used when Context.Render() fails.
	ErrorTypeRender ErrorType = 1 << 62
	// ErrorTypePrivate indicates a private error.
	ErrorTypePrivate ErrorType = 1 << 0
	// ErrorTypePublic indicates a public error.
	ErrorTypePublic ErrorType = 1 << 1
	// ErrorTypeAny indicates any other error.
	ErrorTypeAny ErrorType = 1<<64 - 1
	// ErrorTypeNu indicates any other error.
	ErrorTypeNu = 2
)

type ExtRbacConfig added in v0.0.2

type ExtRbacConfig struct {
	DB        string          `json:"db" mapstructure:"db"`
	Whitelist map[string]bool `json:"whitelist"`
	// contains filtered or unexported fields
}

func (*ExtRbacConfig) IsWhiteList added in v0.0.22

func (r *ExtRbacConfig) IsWhiteList(in string) bool

func (*ExtRbacConfig) Object added in v0.0.22

func (r *ExtRbacConfig) Object() *casbin.Enforcer

type ExtRsa added in v0.0.2

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

func (ExtRsa) Decode added in v0.0.2

func (e ExtRsa) Decode(cipherText string) (string, error)

func (ExtRsa) Encode added in v0.0.2

func (e ExtRsa) Encode(plainText string) (string, error)

type GroupMessageData added in v0.0.20

type GroupMessageData struct {
	Group   string
	Message *MessageData
}

GroupMessageData 组广播数据信息

type H

type H map[string]any

H is a shortcut for map[string]interface{}

func (H) MarshalXML

func (h H) MarshalXML(e *xml.Encoder, start xml.StartElement) error

MarshalXML allows type H to be used with xml.Marshal.

type HandlerFunc

type HandlerFunc func(*Context)

HandlerFunc defines the handler used by gin middleware as return value.

func BasicAuth

func BasicAuth(accounts Accounts) HandlerFunc

BasicAuth returns a Basic HTTP Authorization middleware. It takes as argument a map[string]string where the key is the user name and the value is the password.

func BasicAuthForRealm

func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc

BasicAuthForRealm returns a Basic HTTP Authorization middleware. It takes as arguments a map[string]string where the key is the user name and the value is the password, as well as the name of the Realm. If the realm is empty, "Authorization Required" will be used by default. (see http://tools.ietf.org/html/rfc2617#section-1.2)

func Bind

func Bind(val any) HandlerFunc

Bind is a helper function for given interface object and returns a Gin middleware.

func CustomRecovery

func CustomRecovery(handle RecoveryFunc) HandlerFunc

CustomRecovery returns a middleware that recovers from any panics and calls the provided handle func to handle it.

func CustomRecoveryWithWriter

func CustomRecoveryWithWriter(out io.Writer, handle RecoveryFunc) HandlerFunc

CustomRecoveryWithWriter returns a middleware for a given writer that recovers from any panics and calls the provided handle func to handle it.

func ErrorLogger

func ErrorLogger() HandlerFunc

ErrorLogger returns a HandlerFunc for any error type.

func ErrorLoggerT

func ErrorLoggerT(typ ErrorType) HandlerFunc

ErrorLoggerT returns a HandlerFunc for a given error type.

func ExtCors added in v0.0.2

func ExtCors() HandlerFunc

ExtCors 允许跨域

func ExtInit added in v0.0.2

func ExtInit() HandlerFunc

func ExtLogger added in v0.0.2

func ExtLogger() HandlerFunc

func ExtRequestInfo added in v0.0.2

func ExtRequestInfo() HandlerFunc

func ExtRequestTokenAuth added in v0.0.3

func ExtRequestTokenAuth() HandlerFunc

func ExtTimeout added in v0.0.2

func ExtTimeout() HandlerFunc

ExtTimeout 客户端请求超时

func Logger

func Logger() HandlerFunc

Logger instances a Logger middleware that will write the logs to gin.DefaultWriter. By default, gin.DefaultWriter = os.Stdout.

func LoggerWithConfig

func LoggerWithConfig(conf LoggerConfig) HandlerFunc

LoggerWithConfig instance a Logger middleware with config.

func LoggerWithFormatter

func LoggerWithFormatter(f LogFormatter) HandlerFunc

LoggerWithFormatter instance a Logger middleware with the specified log format function.

func LoggerWithWriter

func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc

LoggerWithWriter instance a Logger middleware with the specified writer buffer. Example: os.Stdout, a file opened in write mode, a socket...

func Recovery

func Recovery() HandlerFunc

Recovery returns a middleware that recovers from any panics and writes a 500 if there was one.

func RecoveryWithWriter

func RecoveryWithWriter(out io.Writer, recovery ...RecoveryFunc) HandlerFunc

RecoveryWithWriter returns a middleware for a given writer that recovers from any panics and writes a 500 if there was one.

func Resp404 added in v0.0.2

func Resp404() HandlerFunc

func Success added in v0.0.2

func Success() HandlerFunc

Success 健康检查

func WrapF

func WrapF(f http.HandlerFunc) HandlerFunc

WrapF is a helper function for wrapping http.HandlerFunc and returns a Gin middleware.

func WrapH

func WrapH(h http.Handler) HandlerFunc

WrapH is a helper function for wrapping http.Handler and returns a Gin middleware.

type HandlersChain

type HandlersChain []HandlerFunc

HandlersChain defines a HandlerFunc slice.

func (HandlersChain) Last

func (c HandlersChain) Last() HandlerFunc

Last returns the last handler in the chain. i.e. the last handler is the main one.

type IConfig added in v0.0.2

type IConfig interface {
	Get(key string) interface{}
	GetString(key string) string
	GetDefaultString(key string, def string) string
	GetBool(key string) bool
	GetInt(key string) int
	GetDefaultInt(key string, def int) int
	GetInt32(key string) int32
	GetInt64(key string) int64
	GetUint(key string) uint
	GetUint32(key string) uint32
	GetUint64(key string) uint64
	GetFloat64(key string) float64
	GetTime(key string) time.Time
	GetDuration(key string) time.Duration
	GetDefaultDuration(key string, def time.Duration) time.Duration
	GetIntSlice(key string) []int
	GetStringSlice(key string) []string
	GetStringMap(key string) map[string]interface{}
	GetStringMapString(key string) map[string]string
	GetStringMapStringSlice(key string) map[string][]string
	UnmarshalKey(key string, val interface{}) error
	Unmarshal(val interface{}) error
}

type IRouter

type IRouter interface {
	IRoutes
	Group(string, ...HandlerFunc) *RouterGroup
}

IRouter defines all router handle interface includes single and group router.

type IRoutes

type IRoutes interface {
	Use(...HandlerFunc) IRoutes

	Handle(string, string, ...HandlerFunc) IRoutes
	Any(string, ...HandlerFunc) IRoutes
	GET(string, ...HandlerFunc) IRoutes
	POST(string, ...HandlerFunc) IRoutes
	DELETE(string, ...HandlerFunc) IRoutes
	PATCH(string, ...HandlerFunc) IRoutes
	PUT(string, ...HandlerFunc) IRoutes
	OPTIONS(string, ...HandlerFunc) IRoutes
	HEAD(string, ...HandlerFunc) IRoutes

	StaticFile(string, string) IRoutes
	StaticFileFS(string, string, http.FileSystem) IRoutes
	Static(string, string) IRoutes
	StaticFS(string, http.FileSystem) IRoutes
}

IRoutes defines all router handle interface.

type List added in v0.0.2

type List struct {
	Code    int      `json:"code"`
	Msg     string   `json:"msg"`
	Data    ListData `json:"data"`
	TraceID string   `json:"TraceId"`
}

type ListData added in v0.0.2

type ListData struct {
	Page    int         `json:"page"`
	Count   int         `json:"count"`
	Total   int         `json:"total"`
	List    interface{} `json:"list"`
	TraceID string      `json:"TraceId"`
}

type LogFormatter

type LogFormatter func(params LogFormatterParams) string

LogFormatter gives the signature of the formatter function passed to LoggerWithFormatter

type LogFormatterParams

type LogFormatterParams struct {
	Request *http.Request

	// TimeStamp shows the time after the server returns a response.
	TimeStamp time.Time
	// StatusCode is HTTP response code.
	StatusCode int
	// Latency is how much time the server cost to process a certain request.
	Latency time.Duration
	// ClientIP equals Context's ClientIP method.
	ClientIP string
	// Method is the HTTP method given to the request.
	Method string
	// Path is a path the client requests.
	Path string
	// ErrorMessage is set if error has occurred in processing the request.
	ErrorMessage string

	// BodySize is the size of the Response Body
	BodySize int
	// Keys are the keys set on the request's context.
	Keys map[string]any
	// contains filtered or unexported fields
}

LogFormatterParams is the structure any formatter will be handed when time to log comes

func (*LogFormatterParams) IsOutputColor

func (p *LogFormatterParams) IsOutputColor() bool

IsOutputColor indicates whether can colors be outputted to the log.

func (*LogFormatterParams) MethodColor

func (p *LogFormatterParams) MethodColor() string

MethodColor is the ANSI color for appropriately logging http method to a terminal.

func (*LogFormatterParams) ResetColor

func (p *LogFormatterParams) ResetColor() string

ResetColor resets all escape attributes.

func (*LogFormatterParams) StatusCodeColor

func (p *LogFormatterParams) StatusCodeColor() string

StatusCodeColor is the ANSI color for appropriately logging http status code to a terminal.

type LoggerConfig

type LoggerConfig struct {
	// Optional. Default value is gin.defaultLogFormatter
	Formatter LogFormatter

	// Output is a writer where logs are written.
	// Optional. Default value is gin.DefaultWriter.
	Output io.Writer

	// SkipPaths is an url path array which logs are not written.
	// Optional.
	SkipPaths []string
}

LoggerConfig defines the config for Logger middleware.

type MessageData added in v0.0.20

type MessageData struct {
	ID      string     `json:"id"`      //消息id
	To      ClientInfo `json:"to"`      //发送给那个客户
	From    ClientInfo `json:"from"`    //从哪个客户发过来的
	Type    string     `json:"type"`    //发送的消息类型
	Message string     `json:"message"` //消息内容
}

func (*MessageData) Bytes added in v0.0.20

func (m *MessageData) Bytes() []byte

type Negotiate

type Negotiate struct {
	Offered  []string
	HTMLName string
	HTMLData any
	JSONData any
	XMLData  any
	YAMLData any
	Data     any
	TOMLData any
}

Negotiate contains all negotiations data.

type Option added in v0.0.11

type Option struct {
	TraceID string
}

func (*Option) Option added in v0.0.11

func (u *Option) Option(opts ...option)

type Param

type Param struct {
	Key   string
	Value string
}

Param is a single URL parameter, consisting of a key and a value.

type Params

type Params []Param

Params is a Param-slice, as returned by the router. The slice is ordered, the first URL parameter is also the first slice value. It is therefore safe to read values by the index.

func (Params) ByName

func (ps Params) ByName(name string) (va string)

ByName returns the value of the first Param which key matches the given name. If no matching Param is found, an empty string is returned.

func (Params) Get

func (ps Params) Get(name string) (string, bool)

Get returns the value of the first Param which key matches the given name and a boolean true. If no matching Param is found, an empty string is returned and a boolean false .

type RbacInterface added in v0.0.22

type RbacInterface interface {
	Object() *casbin.Enforcer
	IsWhiteList(string) bool
}

type RecoveryFunc

type RecoveryFunc func(c *Context, err any)

RecoveryFunc defines the function passable to CustomRecovery.

type RequestFunc added in v0.0.2

type RequestFunc func(*resty.Request) *resty.Request

type Response added in v0.0.2

type Response struct {
	Code    int         `json:"code"`
	Msg     string      `json:"msg"`
	Data    interface{} `json:"data"`
	TraceID string      `json:"TraceId"`
}

func ParseResponse added in v0.0.2

func ParseResponse(data []byte) *Response

type ResponseWriter

type ResponseWriter interface {
	http.ResponseWriter
	http.Hijacker
	http.Flusher
	http.CloseNotifier

	// Status returns the HTTP response status code of the current request.
	Status() int

	// Size returns the number of bytes already written into the response http body.
	// See Written()
	Size() int

	// WriteString writes the string into the response body.
	WriteString(string) (int, error)

	// Written returns true if the response body was already written.
	Written() bool

	// WriteHeaderNow forces to write the http header (status code + headers).
	WriteHeaderNow()

	// Pusher get the http.Pusher for server push
	Pusher() http.Pusher
}

ResponseWriter ...

type ResponseWriterWrapper added in v0.0.2

type ResponseWriterWrapper struct {
	ResponseWriter
	Body *bytes.Buffer // 缓存
}

func (ResponseWriterWrapper) Write added in v0.0.2

func (w ResponseWriterWrapper) Write(b []byte) (int, error)

func (ResponseWriterWrapper) WriteString added in v0.0.2

func (w ResponseWriterWrapper) WriteString(s string) (int, error)

type RouteInfo

type RouteInfo struct {
	Method      string
	Path        string
	Handler     string
	HandlerFunc HandlerFunc
}

RouteInfo represents a request route's specification which contains method and path and its handler.

type RouterGroup

type RouterGroup struct {
	Handlers HandlersChain
	// contains filtered or unexported fields
}

RouterGroup is used internally to configure router, a RouterGroup is associated with a prefix and an array of handlers (middleware).

func (*RouterGroup) Any

func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc) IRoutes

Any registers a route that matches all the HTTP methods. GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE.

func (*RouterGroup) BasePath

func (group *RouterGroup) BasePath() string

BasePath returns the base path of router group. For example, if v := router.Group("/rest/n/v1/api"), v.BasePath() is "/rest/n/v1/api".

func (*RouterGroup) DELETE

func (group *RouterGroup) DELETE(relativePath string, handlers ...HandlerFunc) IRoutes

DELETE is a shortcut for router.Handle("DELETE", path, handle).

func (*RouterGroup) GET

func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes

GET is a shortcut for router.Handle("GET", path, handle).

func (*RouterGroup) Group

func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup

Group creates a new router group. You should add all the routes that have common middlewares or the same path prefix. For example, all the routes that use a common middleware for authorization could be grouped.

func (*RouterGroup) HEAD

func (group *RouterGroup) HEAD(relativePath string, handlers ...HandlerFunc) IRoutes

HEAD is a shortcut for router.Handle("HEAD", path, handle).

func (*RouterGroup) Handle

func (group *RouterGroup) Handle(httpMethod, relativePath string, handlers ...HandlerFunc) IRoutes

Handle registers a new request handle and middleware with the given path and method. The last handler should be the real handler, the other ones should be middleware that can and should be shared among different routes. See the example code in GitHub.

For GET, POST, PUT, PATCH and DELETE requests the respective shortcut functions can be used.

This function is intended for bulk loading and to allow the usage of less frequently used, non-standardized or custom methods (e.g. for internal communication with a proxy).

func (*RouterGroup) OPTIONS

func (group *RouterGroup) OPTIONS(relativePath string, handlers ...HandlerFunc) IRoutes

OPTIONS is a shortcut for router.Handle("OPTIONS", path, handle).

func (*RouterGroup) PATCH

func (group *RouterGroup) PATCH(relativePath string, handlers ...HandlerFunc) IRoutes

PATCH is a shortcut for router.Handle("PATCH", path, handle).

func (*RouterGroup) POST

func (group *RouterGroup) POST(relativePath string, handlers ...HandlerFunc) IRoutes

POST is a shortcut for router.Handle("POST", path, handle).

func (*RouterGroup) PUT

func (group *RouterGroup) PUT(relativePath string, handlers ...HandlerFunc) IRoutes

PUT is a shortcut for router.Handle("PUT", path, handle).

func (*RouterGroup) Static

func (group *RouterGroup) Static(relativePath, root string) IRoutes

Static serves files from the given file system root. Internally a http.FileServer is used, therefore http.NotFound is used instead of the Router's NotFound handler. To use the operating system's file system implementation, use :

router.Static("/static", "/var/www")

func (*RouterGroup) StaticFS

func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes

StaticFS works just like `Static()` but a custom `http.FileSystem` can be used instead. Gin by default user: gin.Dir()

func (*RouterGroup) StaticFile

func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes

StaticFile registers a single route in order to serve a single file of the local filesystem. router.StaticFile("favicon.ico", "./resources/favicon.ico")

func (*RouterGroup) StaticFileFS

func (group *RouterGroup) StaticFileFS(relativePath, filepath string, fs http.FileSystem) IRoutes

StaticFileFS works just like `StaticFile` but a custom `http.FileSystem` can be used instead.. router.StaticFileFS("favicon.ico", "./resources/favicon.ico", Dir{".", false}) Gin by default user: gin.Dir()

func (*RouterGroup) Use

func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes

Use adds middleware to the group, see example code in GitHub.

type RoutesInfo

type RoutesInfo []RouteInfo

RoutesInfo defines a RouteInfo slice.

Directories

Path Synopsis
internal

Jump to

Keyboard shortcuts

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