Documentation ¶
Overview ¶
Package server 服务管理
Index ¶
- func IsValidID(id string) bool
- type BuildProblemFunc
- type CTXSanitizer
- type Context
- func (ctx *Context) Body() (body []byte, err error)
- func (ctx *Context) ClientIP() 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) Location() *time.Location
- func (ctx *Context) Logs() *logs.Logs
- func (ctx *Context) Marshal(status int, body any, problem bool) error
- func (ctx *Context) NotFound() Problem
- func (ctx *Context) NotImplemented() Problem
- func (ctx *Context) Now() time.Time
- 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) ParseTime(layout, value string) (time.Time, error)
- 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) SetLanguage(l string) error
- func (ctx *Context) SetLocation(name string) error
- func (ctx *Context) Sprintf(key message.Reference, v ...any) string
- func (ctx *Context) Unmarshal(v any) error
- func (ctx *Context) Write(bs []byte) (int, error)
- func (ctx *Context) WriteHeader(status int)
- type Encodings
- type HandlerFunc
- type Middleware
- type MiddlewareFunc
- type Module
- func (m *Module) AppendFS(fsys ...fs.FS)
- func (m *Module) BuildID(suffix string) string
- func (m *Module) Cache() cache.Access
- func (m *Module) Description() localeutil.LocaleStringer
- func (m *Module) FileServer(name, index string) HandlerFunc
- func (m *Module) Glob(pattern string) ([]string, error)
- func (m *Module) ID() string
- func (m *Module) LoadLocale(glob string) error
- func (m *Module) Open(name string) (fs.File, error)
- func (m *Module) Server() *Server
- type NewEncodingFunc
- type Options
- type Params
- type Problem
- type Problems
- func (p *Problems) Add(id string, status int, title, detail localeutil.LocaleStringer) *Problems
- func (p *Problems) AddMimetype(mimetype, problemType string) *Problems
- func (p *Problems) BaseURL() string
- func (p *Problems) Problem(printer *message.Printer, id string) Problem
- func (p *Problems) Set(id string, status int, title, detail localeutil.LocaleStringer) *Problems
- func (p *Problems) SetBaseURL(base string)
- func (p *Problems) Visit(f func(string, int, localeutil.LocaleStringer, localeutil.LocaleStringer) bool)
- 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.Cache
- 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() serializer.FS
- func (srv *Server) LanguageTag() language.Tag
- func (srv *Server) LoadLocale(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() serializer.Serializer
- func (srv *Server) Modules(p *message.Printer) map[string]string
- func (srv *Server) Name() string
- func (srv *Server) NewModule(id string, desc localeutil.LocaleStringer) *Module
- 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() *service.Server
- func (srv *Server) Uptime() time.Time
- func (srv *Server) Vars() *sync.Map
- func (srv *Server) Version() string
- 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) Count() 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 ¶
Types ¶
type BuildProblemFunc ¶ added in v0.55.0
BuildProblemFunc 生成 Problem 对象的方法
id 表示当前错误信息的唯一值,这将是一个标准的 URL,指向线上的文档地址,有可能不会真实存在; title 错误信息的简要描述; status 输出的状态码;
type CTXSanitizer ¶
type CTXSanitizer interface { // CTXSanitize 验证和修正当前对象的数据 // // 如果要保存验证的结果,应该调用传递的 [Validation] 对象的方法。 CTXSanitize(*Context, *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) NotImplemented ¶
func (*Context) OnExit ¶ added in v0.49.0
OnExit 注册退出当前请求时的处理函数
f 为退出时的处理方法,其原型为:
func(status int)
其中 status 为最终输出到客户端的状态码。
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 设置输出的语言
默认情况下,会根据用户提交的 Accept-Language 报头设置默认值。
func (*Context) SetLocation ¶ added in v0.49.0
SetLocation 设置时区信息
name 为时区名称,比如 'America/New_York',具体说明可参考 time.LoadLocation
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 Middleware ¶ added in v0.48.0
type Middleware = types.MiddlewareOf[HandlerFunc]
type MiddlewareFunc ¶ added in v0.48.0
type MiddlewareFunc = types.MiddlewareFuncOf[HandlerFunc]
type Module ¶
type Module struct {
// contains filtered or unexported fields
}
func (*Module) AppendFS ¶ added in v0.56.0
AppendFS 添加文件系统
Module 默认以 id 为名称相对于 Server 创建了一个文件系统。 此操作会将 fsys 作为 Module 的另一个文件系统与 Module 相关联, 当查找文件时,会依次以添加的相反顺序查找相应的文件系统,直到找到或是结束。
func (*Module) Description ¶
func (m *Module) Description() localeutil.LocaleStringer
Description 模块的描述信息
func (*Module) FileServer ¶ added in v0.48.0
func (m *Module) FileServer(name, index string) HandlerFunc
FileServer 返回以当前模块作为文件系统的静态文件服务
参数与 Server.FileServer 相同,仅文件系统强制使用当前模块。
func (*Module) LoadLocale ¶ added in v0.41.0
LoadLocale 加载当前模块文件系统下的本地化文件
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 算法
type Options ¶
type Options struct { // 项目默认可存取的文件系统 // // 默认情况下为可执行文件所在的目录。 FS fs.FS // 服务器的时区 // // 默认值为 time.Local Location *time.Location // 缓存系统 // // 默认值为内存类型。 Cache cache.Cache // 日志的输出通道设置 // // 如果此值为空,那么在被初始化 logs.New(nil) 值,表示不会输出到任何通道。 Logs *logs.Logs // 生成 [Problem] 对象的方法 // // 如果为空,那么将采用 [RFC7807Builder] 作为默认值。 ProblemBuilder BuildProblemFunc // 默认的语言标签 // // 在用户请求的报头中没有匹配的语言标签时,会采用此值作为该用户的本地化语言, // 同时也用来初始化 [Server.LocalePrinter]。 // // 如果为空,则会尝试读取当前系统的本地化信息。 LanguageTag language.Tag // http.Server 实例的值 // // 如果为空,表示 &http.Server{} 对象。 HTTPServer *http.Server }
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) Problem // AddParam 添加数据验证错误信息 AddParam(name string, reason string) Problem }
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 struct {
// contains filtered or unexported fields
}
func (*Problems) Add ¶ added in v0.55.0
func (p *Problems) Add(id string, status int, title, detail localeutil.LocaleStringer) *Problems
Add 添加新的错误类型
id 表示该错误的唯一值,如果存在相同会 panic; Problems.Problem 会根据此值查找相应的文字说明给予 title 字段; status 表示输出给客户端的状态码; title 和 detail 表示此 id 关联的简要说明和详细说明;
func (*Problems) AddMimetype ¶ added in v0.55.0
AddMimetype 指定 mimetype 对应的 Problem 时的 content-type 值
mimetype 为正常情况下的 content-type 值,当输出对象为 Problem 时, 可以指定一个特殊的值,比如 application/json 可以对应输出 application/problem+json, 这也是 RFC7807 推荐的作法。
func (*Problems) BaseURL ¶ added in v0.55.0
BaseURL BuildProblemFunc 参数 id 的前缀
返回的内容说明,可参考 Problems.SetBaseURL。
func (*Problems) Set ¶ added in v0.58.0
func (p *Problems) Set(id string, status int, title, detail localeutil.LocaleStringer) *Problems
Set 添加或是修改错误信息
与 Problems.Add 的不同在于:如果 id 已经存在,此方法会作修改,而 Add 则会 panic。
func (*Problems) SetBaseURL ¶ added in v0.55.0
SetBaseURL 设置传递给 BuildProblemFunc 中 id 参数的前缀
Problem 实现者可以根据自由决定 id 字终以什么形式展示, 此处的设置只是决定了传递给 BuildProblemFunc 的 id 参数格式。 可以有以下三种形式:
- 空值 不作任何改变;
- about:blank 将传递空值给 BuildProblemFunc;
- 其它非空值 以前缀形式附加在原本的 id 之上;
func (*Problems) Visit ¶ added in v0.55.0
func (p *Problems) Visit(f func(string, int, localeutil.LocaleStringer, localeutil.LocaleStringer) bool)
Visit 遍历所有由 Problems.Add 添加的项
f 为遍历的函数,其原型为:
func(id string, status int, title, detail localeutil.LocaleStringer)
分别对应 Problems.Add 添加时的各个参数。
用户可以通过此方法生成 QA 页面。
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 表示在验证出错时的错误信息; validator 为验证方法;
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) Files ¶ added in v0.41.0
func (srv *Server) Files() serializer.FS
Files 返回用于序列化文件内容的操作接口
func (*Server) LanguageTag ¶ added in v0.56.0
LanguageTag 返回默认的语言标签
func (*Server) LoadLocale ¶ added in v0.55.0
LoadLocale 加载本地化的文件
func (*Server) LocalePrinter ¶ added in v0.41.0
func (*Server) NewModule ¶ added in v0.40.0
func (srv *Server) NewModule(id string, desc localeutil.LocaleStringer) *Module
NewModule 声明新的模块
id 模块的 ID,需要全局唯一,只能是字母、数字以及下划线。
func (*Server) NewPrinter ¶ added in v0.55.0
func (*Server) Serve ¶
Serve 启动服务
会等待 Server.Close 执行完之后,此函数才会返回,这一点与 http.ListenAndServe 稍有不同。 一旦返回,整个 Server 对象将处于不可用状态。
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) Count ¶ added in v0.57.0
func (v *Validation) Count() 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 将多个验证函数以或的形式合并为一个验证函数