Documentation
¶
Overview ¶
Package server web 服务管理
Index ¶
- Constants
- type BuildResultFunc
- type CTXSanitizer
- type Context
- func (ctx *Context) Body() (body []byte, err error)
- func (ctx *Context) ClientIP() string
- func (ctx *Context) Critical(status int, v ...interface{}) Responser
- func (ctx *Context) Criticalf(status int, format string, v ...interface{}) Responser
- func (ctx *Context) Error(status int, v ...interface{}) Responser
- func (ctx *Context) Errorf(status int, format string, v ...interface{}) Responser
- func (ctx *Context) IsXHR() bool
- func (ctx *Context) Log(level, deep int, v ...interface{})
- func (ctx *Context) Logf(level, deep int, format string, v ...interface{})
- func (ctx *Context) Logs() *logs.Logs
- func (ctx *Context) Marshal(status int, v interface{}, headers map[string]string) error
- func (ctx *Context) Now() time.Time
- func (ctx *Context) ParamID(key, code string) (int64, Responser)
- func (ctx *Context) ParamInt64(key, code string) (int64, Responser)
- func (ctx *Context) ParamString(key, code string) (string, Responser)
- func (ctx *Context) Params() *Params
- func (ctx *Context) ParseTime(layout, value string) (time.Time, error)
- func (ctx *Context) Queries() (*Queries, error)
- func (ctx *Context) QueryObject(v interface{}, code string) Responser
- func (ctx *Context) Read(v interface{}, code string) Responser
- func (ctx *Context) Redirect(status int, url string) Responser
- func (ctx *Context) Result(code string, fields ResultFields) Responser
- func (ctx *Context) Server() *Server
- func (ctx *Context) Sprintf(key message.Reference, v ...interface{}) string
- func (ctx *Context) Unmarshal(v interface{}) error
- type Filter
- type HandlerFunc
- type Options
- type Params
- func (p *Params) Bool(key string) bool
- func (p *Params) Errors() ResultFields
- func (p *Params) Float64(key string) float64
- func (p *Params) HasErrors() bool
- func (p *Params) ID(key string) int64
- func (p *Params) Int64(key string) int64
- func (p *Params) MustBool(key string, def bool) bool
- func (p *Params) MustFloat64(key string, def float64) float64
- func (p *Params) MustID(key string, def int64) int64
- func (p *Params) MustInt64(key string, def int64) int64
- func (p *Params) MustString(key, def string) string
- func (p *Params) Result(code string) Responser
- func (p *Params) String(key string) string
- type Prefix
- func (p *Prefix) Delete(path string, h HandlerFunc) *Prefix
- func (p *Prefix) Get(path string, h HandlerFunc) *Prefix
- func (p *Prefix) Handle(path string, h HandlerFunc, method ...string) *Prefix
- func (p *Prefix) Patch(path string, h HandlerFunc) *Prefix
- func (p *Prefix) Post(path string, h HandlerFunc) *Prefix
- func (p *Prefix) Put(path string, h HandlerFunc) *Prefix
- func (p *Prefix) Remove(path string, method ...string)
- func (p *Prefix) URL(strict bool, path string, params map[string]string) (string, error)
- type Queries
- func (q *Queries) Bool(key string, def bool) bool
- func (q *Queries) Errors() ResultFields
- func (q *Queries) Float64(key string, def float64) float64
- func (q *Queries) HasErrors() bool
- func (q *Queries) Int(key string, def int) int
- func (q *Queries) Int64(key string, def int64) int64
- func (q *Queries) Object(v interface{})
- func (q *Queries) Result(code string) Responser
- func (q *Queries) String(key, def string) string
- type Responser
- type Result
- type ResultFields
- type Router
- func (router *Router) Delete(path string, h HandlerFunc) *Router
- func (router *Router) Get(path string, h HandlerFunc) *Router
- func (router *Router) Handle(path string, h HandlerFunc, method ...string) *Router
- func (router *Router) MuxRouter() *mux.Router
- func (router *Router) Patch(path string, h HandlerFunc) *Router
- func (router *Router) Post(path string, h HandlerFunc) *Router
- func (router *Router) Prefix(prefix string, filter ...Filter) *Prefix
- func (router *Router) Put(path string, h HandlerFunc) *Router
- func (router *Router) Remove(path string, method ...string)
- func (router *Router) URL(strict bool, pattern string, params map[string]string) (string, error)
- type ScheduledJob
- type ScheduledJobFunc
- type Scheduler
- type Server
- func (srv *Server) AddAt(title string, f ScheduledJobFunc, ti time.Time, delay bool)
- func (srv *Server) AddCron(title string, f ScheduledJobFunc, spec string, delay bool)
- func (srv *Server) AddJob(title string, f ScheduledJobFunc, scheduler Scheduler, delay bool)
- func (srv *Server) AddResult(status int, code string, phrase localeutil.LocaleStringer)
- func (srv *Server) AddResults(status int, messages map[string]localeutil.LocaleStringer)
- func (srv *Server) AddService(title string, f ServiceFunc)
- func (srv *Server) AddTicker(title string, f ScheduledJobFunc, dur time.Duration, imm, delay bool)
- func (srv *Server) Cache() cache.Cache
- func (srv *Server) Close(shutdownTimeout time.Duration) error
- func (srv *Server) FileServer(fsys fs.FS, name, index string) HandlerFunc
- func (srv *Server) Files() *serialization.Files
- func (srv *Server) Jobs() []*ScheduledJob
- func (srv *Server) Locale() *serialization.Locale
- func (srv *Server) LocalePrinter() *message.Printer
- func (srv *Server) Location() *time.Location
- func (srv *Server) Logs() *logs.Logs
- func (srv *Server) Middlewares() *middleware.Middlewares
- func (srv *Server) Mimetypes() *serialization.Mimetypes
- func (srv *Server) Name() string
- func (srv *Server) NewContext(w http.ResponseWriter, r *http.Request) *Context
- func (srv *Server) NewFS(path string, fsys ...fs.FS) (fs.FS, error)
- func (srv *Server) NewRouter(name, domain string, matcher group.Matcher, filter ...Filter) *Router
- 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) RemoveRouter(name string)
- func (srv *Server) Result(p *message.Printer, code string, fields ResultFields) Result
- func (srv *Server) Results(p *message.Printer) map[string]string
- func (srv *Server) Router(name string) *Router
- func (srv *Server) Routers() []*Router
- func (srv *Server) Routes() map[string]map[string][]string
- func (srv *Server) Serve() (err error)
- func (srv *Server) Services() []*Service
- func (srv *Server) Serving() bool
- func (srv *Server) Tag() language.Tag
- func (srv *Server) Uptime() time.Time
- func (srv *Server) Vars() *sync.Map
- func (srv *Server) Version() string
- type Service
- type ServiceFunc
- type ServiceState
Constants ¶
const ( ServiceStopped = scheduled.Stopped // 当前处于停止状态,默认状态 ServiceRunning = scheduled.Running // 正在运行 ServiceFailed = scheduled.Failed // 出错,不再执行后续操作 )
几种可能的状态值
const DefaultCharset = "utf-8"
DefaultCharset 默认的字符集
const DefaultMimetype = "application/octet-stream"
DefaultMimetype 默认的媒体类型
在不能获取输入和输出的媒体类型时,会采用此值作为其默认值。
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type BuildResultFunc ¶ added in v0.44.0
BuildResultFunc 用于生成 Result 接口对象的函数
用户可以通过 BuildResultFunc 返回自定义的 Result 对象, 在 Result 中用户可以自定义其展示方式,可参考默认的实现 DefaultResultBuilder
type CTXSanitizer ¶
type CTXSanitizer interface { // CTXSanitize 验证和修正当前对象的数据 // // 返回的是字段名以及对应的错误信息,一个字段可以对应多个错误信息。 CTXSanitize(*Context) ResultFields }
CTXSanitizer 提供对数据的验证和修正
但凡对象实现了该接口,那么在 Context.Read 和 Queries.Object 中会在解析数据成功之后,调用该接口进行数据验证。
可用于 HTTP 请求中对用户提交数据的验证。
type Context ¶
type Context struct { Response http.ResponseWriter Request *http.Request // 指定输出时所使用的媒体类型,以及名称 OutputMimetype serialization.MarshalFunc OutputMimetypeName string // 输出到客户端的字符集 // // 若值为 encoding.Nop 或是空,表示为 utf-8 OutputCharset encoding.Encoding OutputCharsetName string // 客户端内容所使用的媒体类型 InputMimetype serialization.UnmarshalFunc // 客户端内容所使用的字符集 // // 若值为 encoding.Nop 或是空,表示为 utf-8 InputCharset encoding.Encoding // 输出语言的相关设置项 OutputTag language.Tag LocalePrinter *message.Printer // 与当前对话相关的时区 Location *time.Location // 保存 Context 在存续期间的可复用变量 // // 这是比 context.Value 更经济的传递变量方式, // 相较于 context.Value,这并不是协程安全的。 // // 如果需要在多个请求中传递参数,可直接使用 Server.Vars。 Vars map[interface{}]interface{} // contains filtered or unexported fields }
Context 是对当次 HTTP 请求内容的封装
func NewContext ¶
func NewContext(w http.ResponseWriter, r *http.Request) *Context
NewContext 构建 *Context 实例
func (*Context) ClientIP ¶
ClientIP 返回客户端的 IP 地址
NOTE: 包含了端口部分。
获取顺序如下:
- X-Forwarded-For 的第一个元素
- Remote-Addr 报头
- X-Read-IP 报头
func (*Context) Error ¶
Error 输出日志到 ERROR 通道并向用户输出指定状态码的页面
NOTE:应该在出错的地方直接调用 Error,而不是将 Error 嵌套在另外的函数里, 否则出错信息的位置信息将不准确。
func (*Context) Marshal ¶
Marshal 将 v 解码并发送给客户端
status 表示输出的状态码,如果出错,可能输出的不是该状态码; v 输出的对象,若是一个 nil 值,则不会向客户端输出任何内容; 若是需要正常输出一个 nil 类型到客户端(比如JSON 中的 null), 可以传递一个 *struct{} 值,或是自定义实现相应的解码函数; headers 报头信息,如果已经存在于 ctx.Response 将覆盖 ctx.Response 中的值, 如果需要指定一个特定的 Content-Type 和 Content-Language, 可以在 headers 中指定,否则使用当前的编码和语言名称;
func (*Context) ParamID ¶
ParamID 获取地址参数中表示 key 的值并并转换成大于 0 的 int64
相对于 Context.ParamInt64(),该值必须大于 0。
NOTE: 若需要获取多个参数,使用 Context.Params 会更方便。
func (*Context) ParamInt64 ¶
ParamInt64 取地址参数中的 key 表示的值 int64 类型值
NOTE: 若需要获取多个参数,可以使用 Context.Params 获取会更方便。
func (*Context) ParamString ¶
ParamString 取地址参数中的 key 表示的 string 类型值
NOTE: 若需要获取多个参数,可以使用 Context.Params 获取会更方便。
func (*Context) QueryObject ¶
QueryObject 将查询参数解析到一个对象中
func (*Context) Read ¶
Read 从客户端读取数据并转换成 v 对象
功能与 Unmarshal() 相同,只不过 Read() 在出错时,返回的不是 error, 而是一个表示错误信息的 Responser 对象。
如果 v 实现了 CTXSanitizer 接口,则在读取数据之后,会调用其接口函数。 如果验证失败,会输出以 code 作为错误代码的 Responser 对象。
func (*Context) Result ¶ added in v0.40.0
func (ctx *Context) Result(code string, fields ResultFields) Responser
Result 返回 Result 实例
如果找不到 code 对应的错误信息,则会直接 panic。
type Filter ¶
type Filter func(HandlerFunc) HandlerFunc
Filter 适用于 Context 的中间件
Filter 和 github.com/issue9/middleware.Func 本质上没有任何区别, middleware.Func 更加的通用,可以复用市面上的大部分中间件, Filter 则更加灵活一些,适合针对当前框架的中间件。
如果想要使用 middleware.Func,可以调用 Server.MuxGroups().Middlewares() 方法。
func AcceptFilter ¶ added in v0.45.0
AcceptFilter 提供限定 accept 的中间件
type HandlerFunc ¶
HandlerFunc 路由项处理函数原型
如果返回 nil,表示未出现任何错误,可以继续后续操作, 非 nil,表示需要中断执行并向用户输出返回的对象。
func Accept ¶ added in v0.45.0
func Accept(next HandlerFunc, ct ...string) HandlerFunc
Accept 提供限定 accept 的中间件
type Options ¶
type Options struct { // 项目默认可存取的文件系统 // // 默认情况下为可执行文件所在的目录。 FS fs.FS // 服务器的时区 // // 默认值为 time.Local Location *time.Location // 指定生成 Result 数据的方法 // // 默认情况下指向 DefaultResultBuilder。 ResultBuilder BuildResultFunc // 缓存系统 // // 默认值为内存类型。 Cache cache.Cache // 端口号 // // 格式参照 net/http.Server.Addr 字段。 // 可以为空,表示由 net/http.Server 确定其默认值。 // // NOTE: 该值可能会被 HTTPServer 的操作所覆盖。 Port string // 初始化路由的参数 // // 这些选项会应用在所有的路由上,但是并不是所有选项都起作用, // 比如 mux.URLDomain,该值始终是在 NewRouter 中指定。 // 可以为空。 RouterOptions []mux.Option // 可以对 http.Server 的内容进行修改 // // NOTE: 对 http.Server.Handler 的修改不会启作用,该值始终会指向 Server.groups HTTPServer func(*http.Server) // 日志的输出通道设置 // // 如果此值为空,那么在被初始化 logs.New(nil) 值,表示不会输出到任何通道。 Logs *logs.Logs // 指定用于序列化文件的方法 // // 该对象同时被用于加载配置文件和序列化文件。 如果为空,会初始化一个空对象。 Files *serialization.Files // 默认的语言标签 // // 在用户请求的报头中没有匹配的语言标签时,会采用此值作为该用户的本地化语言, // 同时也用来初始化 Server.LocalePrinter。 // // 如果为空,则会尝试读取当前系统的本地化信息。 Tag language.Tag // 本地化操作的对象 // // 与 Files 组合构建 serialization.Locale 对象,可以为空。 Catalog *catalog.Builder // contains filtered or unexported fields }
Options 初始化 Server 的参数
type Params ¶
type Params struct {
// contains filtered or unexported fields
}
Params 用于处理路径中包含的参数
p := ctx.Params() aid := p.Int64("aid") bid := p.Int64("bid") if p.HasErrors() { // do something return }
func (*Params) Bool ¶
Bool 获取参数 key 所代表的值并转换成 bool
最终会调用 strconv.ParseBool 进行转换, 也只有该方法中允许的字符串会被正确转换。
func (*Params) MustBool ¶
MustBool 获取参数 key 所代表的值并转换成 bool
若不存在或是转换出错,则返回 def 作为其默认值。 仅在类型转换出错时,才会向 errors 写入错误信息。
最终会调用 strconv.ParseBool 进行转换, 也只有该方法中允许的字符串会被正确转换。
func (*Params) MustFloat64 ¶
MustFloat64 获取参数 key 所代表的值并转换成 float64
若不存在或是转换出错,则返回 def 作为其默认值。 仅在类型转换出错时,才会向 errors 写入错误信息。
func (*Params) MustID ¶
MustID 获取参数 key 所代表的值并转换成 int64
值必须大于 0,否则会输出错误信息,并返回零值。
若不存在或是转换出错,则返回 def 作为其默认值。 仅在类型转换出错或是小于零时,才会向 errors 写入错误信息。
func (*Params) MustInt64 ¶
MustInt64 获取参数 key 所代表的值并转换成 int64
若不存在或是转换出错,则返回 def 作为其默认值。 仅在类型转换出错时,才会向 errors 写入错误信息。
type Prefix ¶
type Prefix struct {
// contains filtered or unexported fields
}
Prefix 带有统一前缀的路由管理
type Queries ¶
type Queries struct {
// contains filtered or unexported fields
}
Queries 用于处理路径中的查询参数
q,_ := ctx.Queries() page := q.Int64("page", 1) size := q.Int64("size", 20) if q.HasErrors() { // do something return }
func (*Queries) Object ¶
func (q *Queries) Object(v interface{})
Object 将查询参数解析到一个对象中
具体的文档信息可以参考 https://github.com/issue9/query
如果 v 实现了 CTXSanitizer 接口,则在读取数据之后,会调用其接口函数。 如果验证失败,错误信息存入 q.errors。
type Responser ¶ added in v0.40.0
type Responser interface { // Status 状态码 Status() int // Headers 输出的报头 Headers() map[string]string // Body 输出到 body 部分的对象 // // 该对象最终经由 serialization.MarshalFunc 转换成文本输出。 Body() interface{} }
Responser 表示向客户端输出的对象
func Exit ¶ added in v0.44.0
func Exit() Responser
Exit 不再执行后续操作退出当前请求
与其它返回的区别在于,Exit 表示已经向客户端输出相关内容,仅作退出。
type Result ¶
type Result interface { // Add 添加详细的错误信息 // // 相同的 key 应该能关联多个 val 值。 Add(key string, val ...string) // Set 设置详细的错误信息 // // 如果已经相同的 key,会被覆盖。 Set(key string, val ...string) // HasFields 是否存在详细的错误信息 // // 如果有通过 Add 添加内容,那么应该返回 true HasFields() bool // Status HTTP 状态码 // // 最终会经此值作为 HTTP 状态会返回给用户 Status() int }
Result 展示错误代码需要实现的接口
func DefaultResultBuilder ¶ added in v0.44.0
DefaultResultBuilder 默认的 BuildResultFunc 实现
支持以下格式的返回信息:
JSON:
{ 'message': 'error message', 'code': '4000001', 'fields':[ {'name': 'username': 'message': ['名称过短', '不能包含特殊符号']}, {'name': 'password': 'message': ['不能为空']}, ] }
XML:
<result code="400"> <message>error message</message> <field name="username"> <message>名称过短</message> <message>不能包含特殊符号</message> </field> <field name="password"><message>不能为空</message></field> </result>
YAML:
message: 'error message' code: '40000001' fields: - name: username message: - 名称过短 - 不能包含特殊符号 - name: password message: - 不能为空
protobuf:
message Result { string message = 1; string code = 2; repeated Field fields = 3; } message Field { string name = 1; repeated string message = 2; }
FormData:
message=errormessage&code=4000001&fields.username=名称过短&fields.username=不能包含特殊符号&fields.password=不能为空
protobuf
message Result { string message = 1; string code = 2; repeated Field fields = 3; } message Field { string name = 1; repeated string message = 2; }
type ResultFields ¶ added in v0.44.0
type ResultFields = validation.Messages
ResultFields 表示字段的错误信息列表
原始类型为 map[string][]string
type Router ¶
type Router struct {
// contains filtered or unexported fields
}
Router 路由
func (*Router) Handle ¶
func (router *Router) Handle(path string, h HandlerFunc, method ...string) *Router
type ScheduledJob ¶ added in v0.44.0
type ScheduledJobFunc ¶ added in v0.44.0
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server 提供 HTTP 服务
func New ¶
New 返回 *Server 实例
name, version 表示服务的名称和版本号; o 指定了初始化 Server 一些非必要参数。在传递给 New 之后,再对其值进行改变,是无效的。
func (*Server) AddAt ¶ added in v0.44.0
AddAt 添加新的定时任务
f 表示服务的运行函数; title 是对该服务的简要说明; t 指定的时间点; delay 是否在任务执行完之后,才计算下一次的执行时间点。
func (*Server) AddCron ¶ added in v0.44.0
func (srv *Server) AddCron(title string, f ScheduledJobFunc, spec string, delay bool)
AddCron 添加新的定时任务
f 表示服务的运行函数; title 是对该服务的简要说明; spec cron 表达式,支持秒; delay 是否在任务执行完之后,才计算下一次的执行时间点。
func (*Server) AddJob ¶ added in v0.44.0
func (srv *Server) AddJob(title string, f ScheduledJobFunc, scheduler Scheduler, delay bool)
AddJob 添加新的计划任务
f 表示服务的运行函数; title 是对该服务的简要说明; scheduler 计划任务的时间调度算法实现; delay 是否在任务执行完之后,才计算下一次的执行时间点。
func (*Server) AddResult ¶ added in v0.41.0
func (srv *Server) AddResult(status int, code string, phrase localeutil.LocaleStringer)
AddResult 添加一条错误信息
status 指定了该错误代码反馈给客户端的 HTTP 状态码;
func (*Server) AddResults ¶ added in v0.42.0
func (srv *Server) AddResults(status int, messages map[string]localeutil.LocaleStringer)
AddResults 添加多条错误信息
func (*Server) AddService ¶ added in v0.44.0
func (srv *Server) AddService(title string, f ServiceFunc)
AddService 添加新的服务
f 表示服务的运行函数; title 是对该服务的简要说明。
NOTE: 如果 Manager 的所有服务已经处于运行的状态,则会自动运行新添加的服务。
func (*Server) AddTicker ¶ added in v0.44.0
AddTicker 添加新的定时任务
f 表示服务的运行函数; title 是对该服务的简要说明; dur 时间间隔; imm 是否立即执行一次该任务; delay 是否在任务执行完之后,才计算下一次的执行时间点。
func (*Server) FileServer ¶ added in v0.44.0
func (srv *Server) FileServer(fsys fs.FS, name, index string) HandlerFunc
FileServer 提供静态文件服务
fsys 为文件系统,如果为空则采用 srv.FS; name 表示参数名称; index 表示 目录下的默认文件名;
func (*Server) Files ¶ added in v0.41.0
func (srv *Server) Files() *serialization.Files
Files 返回用于序列化文件内容的操作接口
func (*Server) Locale ¶ added in v0.41.0
func (srv *Server) Locale() *serialization.Locale
Locale 操作操作本地化文件的接口
func (*Server) LocalePrinter ¶ added in v0.41.0
func (*Server) Middlewares ¶ added in v0.44.0
func (srv *Server) Middlewares() *middleware.Middlewares
func (*Server) Mimetypes ¶
func (srv *Server) Mimetypes() *serialization.Mimetypes
Mimetypes 返回用于序列化 web 内容的操作接口
func (*Server) NewContext ¶
NewContext 构建 *Context 实例
如果不合规则,会以指定的状码退出。 比如 Accept 的内容与当前配置无法匹配,则退出(panic)并输出 NotAcceptable 状态码。
func (*Server) NewFS ¶ added in v0.44.0
NewFS 创建一个基于当前文件系统的子文件系统
fsys 可以指定另外同等级的文件系统,多个文件系统可以共存, 当前查找文件时,会依次查找各个文件系统,直到找到文件或是不存在于任何文件系统。
func (*Server) NewRouter ¶ added in v0.40.0
NewRouter 构建基于 matcher 匹配的路由操作实例
domain 仅用于 URL 生成地址,并不会对路由本身产生影响,可以为空。
func (*Server) RemoveRouter ¶ added in v0.40.0
func (*Server) Result ¶ added in v0.41.0
Result 返回 Result 实例
如果找不到 code 对应的错误信息,则会直接 panic。 fields 表示明细字段,可以为空,之后通过 Result.Add 添加。
func (*Server) Routes ¶ added in v0.44.0
Routes 返回所有路由的注册路由项
第一个键名表示路由名称,第二键值表示路由项地址,值表示该路由项支持的请求方法;
type Service ¶ added in v0.44.0
type Service struct { Title string // contains filtered or unexported fields }
Service 服务模型
type ServiceFunc ¶ added in v0.45.0
ServiceFunc 服务实际需要执行的函数
实现者需要正确处理 ctx.Done 事件,调用者可能会主动取消函数执行; 如果是通 ctx.Done 取消的,应该返回 context.Canceled。