Documentation ¶
Overview ¶
Package server 服务管理
Index ¶
- type BuildProblemFunc
- type CTXSanitizer
- type Context
- func (ctx *Context) Body() (body []byte, err error)
- func (ctx *Context) Charset() string
- func (ctx *Context) ClientIP() string
- func (ctx *Context) Encoding() string
- func (ctx *Context) Error(id string, level logs.Level, err error) Problem
- func (ctx *Context) Header() http.Header
- func (ctx *Context) InternalServerError(err error) Problem
- func (ctx *Context) IsXHR() bool
- func (ctx *Context) LanguageTag() language.Tag
- func (ctx *Context) LocalePrinter() *message.Printer
- func (ctx *Context) Logs() *logs.Logs
- func (ctx *Context) Marshal(status int, body any, problem bool) error
- func (ctx *Context) Mimetype(problem bool) string
- func (ctx *Context) NewValidation(exitAtError bool) *Validation
- func (ctx *Context) NotFound() Problem
- func (ctx *Context) NotImplemented() Problem
- func (ctx *Context) OnExit(f func(int))
- func (ctx *Context) ParamID(key, id string) (int64, Responser)
- func (ctx *Context) ParamInt64(key, id string) (int64, Responser)
- func (ctx *Context) ParamString(key, id string) (string, Responser)
- func (ctx *Context) Params(exitAtError bool) *Params
- func (ctx *Context) Problem(id string) Problem
- func (ctx *Context) Queries(exitAtError bool) (*Queries, error)
- func (ctx *Context) QueryObject(exitAtError bool, v any, id string) Responser
- func (ctx *Context) Read(exitAtError bool, v any, id string) Responser
- func (ctx *Context) Request() *http.Request
- func (ctx *Context) Route() types.Route
- func (ctx *Context) Server() *Server
- func (ctx *Context) SetCharset(charset string)
- func (ctx *Context) SetEncoding(enc string)
- func (ctx *Context) SetLanguage(tag language.Tag)
- func (ctx *Context) SetMimetype(mimetype string)
- func (ctx *Context) Sprintf(key message.Reference, v ...any) string
- func (ctx *Context) Unmarshal(v any) error
- func (ctx *Context) Unwrap() http.ResponseWriter
- func (ctx *Context) Write(bs []byte) (int, error)
- func (ctx *Context) WriteHeader(status int)
- func (ctx *Context) Wrote() bool
- type Encodings
- type Files
- type HandlerFunc
- type MarshalFunc
- type Middleware
- type MiddlewareFunc
- type Mimetypes
- type NewEncodingFunc
- type Options
- type Params
- type Problem
- type Problems
- type Queries
- func (q *Queries) Bool(key string, def bool) bool
- func (q *Queries) Float64(key string, def float64) float64
- func (q *Queries) Int(key string, def int) int
- func (q *Queries) Int64(key string, def int64) int64
- func (q *Queries) Object(v any, id string)
- func (q *Queries) Problem(id string) Responser
- func (q *Queries) String(key, def string) string
- type Responser
- type ResponserFunc
- type Router
- type Routers
- type Rule
- type Server
- func (srv *Server) Cache() cache.CleanableCache
- func (srv *Server) CatalogBuilder() *catalog.Builder
- func (srv *Server) Close(shutdownTimeout time.Duration) error
- func (srv *Server) Encodings() Encodings
- func (srv *Server) FileServer(fsys fs.FS, name, index string) HandlerFunc
- func (srv *Server) Files() *Files
- func (srv *Server) LanguageTag() language.Tag
- func (srv *Server) LoadLocales(fsys fs.FS, glob string) error
- func (srv *Server) LocalePrinter() *message.Printer
- func (srv *Server) Location() *time.Location
- func (srv *Server) Logs() *logs.Logs
- func (srv *Server) Mimetypes() Mimetypes
- func (srv *Server) Name() string
- func (srv *Server) NewPrinter(tag language.Tag) *message.Printer
- func (srv *Server) Now() time.Time
- func (srv *Server) OnClose(f ...func() error)
- func (srv *Server) Open(name string) (fs.File, error)
- func (srv *Server) ParseTime(layout, value string) (time.Time, error)
- func (srv *Server) Problems() Problems
- func (srv *Server) Routers() *Routers
- func (srv *Server) Serve() (err error)
- func (srv *Server) Services() *Services
- func (srv *Server) Uptime() time.Time
- func (srv *Server) Vars() *sync.Map
- func (srv *Server) Version() string
- type Services
- type StatusProblem
- type UnmarshalFunc
- type ValidateFunc
- type Validation
- func (v *Validation) Add(name string, reason localeutil.LocaleStringer) *Validation
- func (v *Validation) AddField(val any, name string, rules ...*Rule) *Validation
- func (v *Validation) AddMapField(val any, name string, rules ...*Rule) *Validation
- func (v *Validation) AddSliceField(val any, name string, rules ...*Rule) *Validation
- func (v *Validation) Context() *Context
- func (v *Validation) Len() int
- func (v *Validation) Problem(id string) Problem
- func (v *Validation) When(cond bool, f func(v *Validation)) *Validation
- type Validator
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type BuildProblemFunc ¶ added in v0.55.0
BuildProblemFunc 生成 Problem 对象的方法
id 表示当前错误信息的唯一值,该值有可能为 about:blank,表示不想向用户展示具体的值; title 错误信息的简要描述; status 输出的状态码;
type CTXSanitizer ¶
type CTXSanitizer interface { // CTXSanitize 验证和修正当前对象的数据 CTXSanitize(*Validation) }
CTXSanitizer 在 Context 关联的上下文环境中对数据进行验证和修正
在 Context.Read、Context.QueryObject 以及 Queries.Object 中会在解析数据成功之后会调用该接口。
type Context ¶
type Context struct { // 保存 Context 在存续期间的可复用变量 // // 这是比 context.Value 更经济的传递变量方式,但是这并不是协程安全的。 Vars map[any]any // contains filtered or unexported fields }
Context 根据当次 HTTP 请求生成的上下文内容
Context 同时也实现了 http.ResponseWriter 接口, 但是不推荐非必要情况下直接使用 http.ResponseWriter 的接口方法, 而是采用返回 Responser 的方式向客户端输出内容。
func (*Context) ClientIP ¶
ClientIP 返回客户端的 IP 地址及端口
获取顺序如下:
- X-Forwarded-For 的第一个元素
- Remote-Addr 报头
- X-Read-IP 报头
func (*Context) InternalServerError ¶ added in v0.49.0
InternalServerError 输出 ERROR 通道并向返回 500 表示的 Problem 对象
func (*Context) LanguageTag ¶ added in v0.49.0
func (*Context) LocalePrinter ¶
func (*Context) Marshal ¶
Marshal 向客户端输出内容
status 想输出给用户状态码,如果出错,那么最终展示给用户的状态码可能不是此值; body 表示输出的对象,该对象最终调用 ctx.outputMimetype 编码; problem 表示 body 是否为 Problem 对象,对于 Problem 对象可能会有特殊的处理;
func (*Context) Mimetype ¶ added in v0.60.0
Mimetype 输出编码名称
problem 表示是否返回 problem 时的 mimetype 值。该值由 Mimetypes 设置。
func (*Context) NewValidation ¶ added in v0.52.0
func (ctx *Context) NewValidation(exitAtError bool) *Validation
NewValidation 声明验证对象
func (*Context) NotImplemented ¶
func (*Context) OnExit ¶ added in v0.49.0
OnExit 注册退出当前请求时的处理函数
f 为退出时的处理方法,其原型为:
func(status int)
其中 status 为最终输出到客户端的状态码, 如果用户是通过 Context.Unwrap 返回的对象写入报头的,那么该值可能并不是用户期待的值。
func (*Context) ParamID ¶
ParamID 获取地址参数中表示 key 的值并并转换成大于 0 的 int64
NOTE: 若需要获取多个参数,使用 Context.Params 会更方便。
func (*Context) ParamInt64 ¶
ParamInt64 取地址参数中的 key 表示的值并尝试工转换成 int64 类型
NOTE: 若需要获取多个参数,可以使用 Context.Params 获取会更方便。
func (*Context) ParamString ¶
ParamString 取地址参数中的 key 表示的值并尝试工转换成 string 类型
NOTE: 若需要获取多个参数,可以使用 Context.Params 获取会更方便。
func (*Context) Problem ¶ added in v0.55.0
Problem 返回批定 id 的错误信息
id 通过此值从 Problems 中查找相应在的 title 并赋值给返回对象;
func (*Context) QueryObject ¶
QueryObject 将查询参数解析到一个对象中
func (*Context) Read ¶
Read 从客户端读取数据并转换成 v 对象
如果 v 实现了 CTXSanitizer 接口,则在读取数据之后,会调用其接口函数。 如果验证失败,会输出以 id 作为错误代码的 Responser 对象。
func (*Context) SetLanguage ¶ added in v0.49.0
SetLanguage 修改输出的语言
NOTE: 不会影响 Context.Request 的返回对象。
func (*Context) SetMimetype ¶ added in v0.60.0
SetMimetype 设置输出的格式
NOTE: 不会影响 Context.Request 的返回对象。
func (*Context) Unwrap ¶ added in v0.60.0
func (ctx *Context) Unwrap() http.ResponseWriter
https://github.com/golang/go/blob/master/src/net/http/responsecontroller.go#L41
func (*Context) WriteHeader ¶ added in v0.48.0
type Encodings ¶ added in v0.55.1
type Encodings interface { // Add 添加压缩算法 // // id 表示当前算法的唯一名称,在 Allow 中可以用来查找使用; // name 表示通过 Accept-Encoding 匹配的名称; // f 表示生成压缩对象的方法; Add(id, name string, f NewEncodingFunc) // Allow 允许 contentType 采用的压缩方式 // // id 是指由 Add 中指定的值; // contentType 表示经由 Accept-Encoding 提交的值,该值不能是 identity 和 *; // // 如果未添加任何算法,则每个请求都相当于是 identity 规则。 Allow(contentType string, id ...string) }
type MarshalFunc ¶ added in v0.61.0
MarshalFunc 序列化函数原型
NOTE: MarshalFunc 的实现中不能调用 Context.Marshal 方法。
type Middleware ¶ added in v0.48.0
type Middleware = types.MiddlewareOf[HandlerFunc]
type MiddlewareFunc ¶ added in v0.48.0
type MiddlewareFunc = types.MiddlewareFuncOf[HandlerFunc]
type Mimetypes ¶ added in v0.61.0
type Mimetypes interface { // Exists 是否存在同名的 Exists(string) bool // Delete 删除指定名称的编码方法 Delete(string) // Add 添加新的编码方法 // // name 为编码名称; // problem 为该编码在返回 [Problem] 对象时的 mimetype 报头值,如果为空,则会被赋予 name 相同的值; Add(name string, m MarshalFunc, u UnmarshalFunc, problem string) // Set 修改指定名称的相关配置 // // name 用于查找相关的编码方法; // 如果 problem 为空,会被赋予与 name 相同的值; Set(name string, m MarshalFunc, u UnmarshalFunc, problem string) Len() int }
type NewEncodingFunc ¶ added in v0.55.0
type NewEncodingFunc = encoding.NewEncodingFunc
func EncodingBrotli ¶ added in v0.55.1
func EncodingBrotli(o brotli.WriterOptions) NewEncodingFunc
EncodingBrotli 返回指定配置的 br 算法
func EncodingCompress ¶ added in v0.55.1
func EncodingCompress(order lzw.Order, width int) NewEncodingFunc
EncodingCompress 返回指定配置的 compress 算法
func EncodingDeflate ¶ added in v0.55.1
func EncodingDeflate(level int) NewEncodingFunc
EncodingDeflate 返回指定配置的 deflate 算法
func EncodingGZip ¶ added in v0.55.1
func EncodingGZip(level int) NewEncodingFunc
EncodingGZip 返回指定配置的 gzip 算法
func EncodingZstd ¶ added in v0.59.0
func EncodingZstd(o ...zstd.EOption) NewEncodingFunc
EncodingZstd 返回指定配置的 zstd 算法
type Options ¶
type Options struct { // 项目默认可存取的文件系统 // // 默认情况下为可执行文件所在的目录。 FS fs.FS // 服务器的时区 // // 默认值为 [time.Local] Location *time.Location // 缓存系统 // // 默认值为内存类型。 Cache cache.Driver // 日志的输出通道设置 // // 如果此值为空,那么在被初始化 logs.New(nil) 值,表示不会输出到任何通道。 Logs *logs.Logs // 生成 [Problem] 对象的方法 // // 如果为空,那么将采用 [RFC7807Builder] 作为默认值。 ProblemBuilder BuildProblemFunc // 默认的语言标签 // // 在用户请求的报头中没有匹配的语言标签时,会采用此值作为该用户的本地化语言, // 同时也用来初始化 [Server.LocalePrinter]。 // // 如果为空,则会尝试读取当前系统的本地化信息。 LanguageTag language.Tag // http.Server 实例的值 // // 如果为空,表示 &http.Server{} 对象。 HTTPServer *http.Server // 路由选项 // // 将应用 [Server.Routers] 对象之上。 RoutersOptions []mux.Option }
type Params ¶
type Params struct {
// contains filtered or unexported fields
}
type Problem ¶ added in v0.55.0
type Problem interface { Responser // With 添加新的输出字段 // // 如果添加的字段名称与现有的字段重名,应当 panic。 With(key string, val any) // AddParam 添加数据验证错误信息 AddParam(name string, reason string) }
Problem API 错误信息对象需要实现的接口
Problem 是对 Responser 细化,用于反馈给用户非正常状态下的数据, 比如用户提交的数据错误,往往会返回 400 的状态码, 并附带一些具体的字段错误信息,此类数据都可以以 Problem 对象的方式反馈给用户。
除了当前接口,该对象可能还要实现相应的序列化接口,比如要能被 JSON 解析, 就要实现 json.Marshaler 接口或是相应的 struct tag。
并未规定实现者输出的字段名和布局,实现者可以根据 BuildProblemFunc 给定的参数,结合自身需求决定。比如 RFC7807Builder 是对 RFC7807 的实现。
func RFC7807Builder ¶ added in v0.55.0
RFC7807Builder BuildProblemFunc 的 RFC7807 标准实现
NOTE: 由于 www-form-urlencoded 对复杂对象的表现能力有限, 在此模式下将忽略由 [Problem.With] 添加的复杂类型,只保留基本类型。
type Problems ¶ added in v0.55.0
type Problems interface { // TypePrefix [BuildProblemFunc] 参数 id 的前缀 TypePrefix() string // SetTypePrefix 设置 id 的前缀 // // 如果设置成 about:blank 那么将不输出 id SetTypePrefix(string) // Add 添加新的错误类型 Add(...*StatusProblem) Exists(id string) bool Problems() []*StatusProblem // Problem 根据 id 生成 [Problem] 对象 Problem(printer *message.Printer, id string) Problem // Status 添加一组固定状态码的错误码 Status(int) *problems.StatusProblems[Problem] }
type Queries ¶
type Queries struct {
// contains filtered or unexported fields
}
func (*Queries) Object ¶
Object 将查询参数解析到一个对象中
具体的文档信息可以参考 https://github.com/issue9/query
如果 v 实现了 CTXSanitizer 接口,则在读取数据之后,会调用其接口函数。
type Responser ¶ added in v0.40.0
type Responser interface { // Apply 通过 [Context] 将当前内容渲染到客户端 // // 在调用 Apply 之后,就不再使用 Responser 对象, // 如果你的对象支持 sync.Pool 复用,可以在 Apply 退出之际回收。 Apply(*Context) }
Responser 表示向客户端输出对象最终需要实现的接口
type ResponserFunc ¶ added in v0.55.0
type ResponserFunc func(*Context)
func (ResponserFunc) Apply ¶ added in v0.55.0
func (f ResponserFunc) Apply(c *Context)
type Router ¶
type Router = mux.RouterOf[HandlerFunc]
type Routers ¶ added in v0.48.0
type Routers = group.GroupOf[HandlerFunc]
type Rule ¶ added in v0.57.0
type Rule struct {
// contains filtered or unexported fields
}
func NewRule ¶ added in v0.57.0
func NewRule(message localeutil.LocaleStringer, validator Validator) *Rule
NewRule 声明一条验证规则
message 表示在验证出错时的错误信息;
func NewRuleFunc ¶ added in v0.57.0
func NewRuleFunc(message localeutil.LocaleStringer, f func(any) bool) *Rule
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server web 服务对象
func (*Server) CatalogBuilder ¶ added in v0.55.0
func (*Server) FileServer ¶ added in v0.44.0
func (srv *Server) FileServer(fsys fs.FS, name, index string) HandlerFunc
FileServer 构建静态文件服务对象
fsys 为文件系统,如果为空则采用 Server 本身; name 表示地址中表示文件名部分的参数名称; index 表示目录下的默认文件名;
func (*Server) LanguageTag ¶ added in v0.56.0
LanguageTag 返回默认的语言标签
func (*Server) LoadLocales ¶ added in v0.61.0
LoadLocales 加载本地化的内容
func (*Server) LocalePrinter ¶ added in v0.41.0
func (*Server) NewPrinter ¶ added in v0.55.0
func (*Server) Serve ¶
Serve 启动服务
会等待 Server.Close 执行完之后,此函数才会返回,这一点与 http.ListenAndServe 稍有不同。 一旦返回,整个 Server 对象将处于不可用状态。
type StatusProblem ¶ added in v0.61.0
type StatusProblem = problems.StatusProblem
type UnmarshalFunc ¶ added in v0.61.0
UnmarshalFunc 反序列化函数原型
type ValidateFunc ¶ added in v0.57.0
ValidateFunc 用于验证指定数据的合法性
func (ValidateFunc) IsValid ¶ added in v0.57.0
func (f ValidateFunc) IsValid(v any) bool
type Validation ¶ added in v0.56.0
type Validation struct {
// contains filtered or unexported fields
}
Validation 数据验证工具
func (*Validation) Add ¶ added in v0.57.0
func (v *Validation) Add(name string, reason localeutil.LocaleStringer) *Validation
Add 直接添加一条错误信息
func (*Validation) AddField ¶ added in v0.56.0
func (v *Validation) AddField(val any, name string, rules ...*Rule) *Validation
AddField 验证新的字段
val 表示需要被验证的值; name 表示当前字段的名称,当验证出错时,以此值作为名称返回给用户; rules 表示验证的规则,按顺序依次验证。
func (*Validation) AddMapField ¶ added in v0.56.0
func (v *Validation) AddMapField(val any, name string, rules ...*Rule) *Validation
AddMapField 验证 map 字段
如果字段类型不是 map,将添加一条错误信息,并退出验证。
func (*Validation) AddSliceField ¶ added in v0.56.0
func (v *Validation) AddSliceField(val any, name string, rules ...*Rule) *Validation
AddSliceField 验证数组字段
如果字段类型不是数组或是字符串,将添加一条错误信息,并退出验证。
func (*Validation) Context ¶ added in v0.59.4
func (v *Validation) Context() *Context
func (*Validation) Len ¶ added in v0.62.0
func (v *Validation) Len() int
func (*Validation) Problem ¶ added in v0.56.0
func (v *Validation) Problem(id string) Problem
Problem 转换成 Problem 对象
如果当前对象没有收集到错误,那么将返回 nil。
func (*Validation) When ¶ added in v0.56.0
func (v *Validation) When(cond bool, f func(v *Validation)) *Validation
When 只有满足 cond 才执行 f 中的验证
f 中的 v 即为当前对象;
type Validator ¶ added in v0.57.0
Validator 用于验证指定数据的合法性
func AndValidateFunc ¶ added in v0.57.0
func AndValidator ¶ added in v0.57.0
AndValidator 将多个验证函数以与的形式合并为一个验证函数
func OrValidateFunc ¶ added in v0.57.0
func OrValidator ¶ added in v0.57.0
OrValidator 将多个验证函数以或的形式合并为一个验证函数