web

package module
v0.32.0 Latest Latest
Warning

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

Go to latest
Published: Oct 3, 2020 License: MIT Imports: 25 Imported by: 70

README

web Test Go version Go Report Card license codecov PkgGoDev

web 是一个比较完整的 API 开发框架,相对于简单的路由,提供了更多的便利功能。

如果你只是需要一个简单的路由工具,那么你可以移步到 mux

package main

import "github.com/issue9/web"

// main.go
func main() {
    conf := web.Classic("./appconfig/web.yaml")

    // 注册模块信息
    m1.Init()
    m2.Init()

    web.Serve()
}

// modules/m1/module.go
func Init(s *web.MODServer) {
    s.NewModule("m1", "模块描述信息").
        Get("/admins", getAdmins).
        Get("/groups", getGroups)
}

// modules/m2/module.go
func Init(s *web.MODServer) {
    s.NewModule("m2", "模块描述信息", "m1").
        Get("/admins", getAdmins).
        Get("/groups", getGroups)
}

项目结构

这只是推荐的目录结构,但不是必须按照此来。

+----- common 一些公用的包
|
+----- modules 各个模块的代码
|        |
|        +----- module1
|        |
|        +----- module2
|
+----- cmd
|        |
|        +----- main.go
|        |
|        |----- appconfig 配置文存放路径
|                  |
|                  +----- web.yaml 框架本身的配置文件
|                  |
|                  +----- logs.xml 日志配置文件
|

模块

项目主要代码都在 modules 下的各个模块里,每一个模块需要包含一个初始化函数, 用于向框架注册当前模块的一些主要信息。通过 web.MODServer 注册模块:

package m1

import "github.com/issue9/web"

func Init(s *web.MODServer) {
    m := s.NewModule("test", "测试模块")

    m.AddInit(func() error {
        // TODO 此处可以添加初始化模块的相关代码
        return nil
    }, "初始化函数描述")

    m.AddService(func(ctx context.Context) error {
        // TODO 此处添加服务代码
    }, "服务描述")
}

配置文件

通过 web.Classic() 函数,可以在初始化时指定配置文件,文件格式可以是 XML、JSON 和 YAML。用户也可以自行添加新的格式支持。

web.yaml

以下是该文件的所有配置项:

名称 类型 描述
debug bool 是否启用调试模式
root string 项目的根路径,比如 /blog
plugins string 指定需要加载的插件,可以使用 glob 模式,仅支持部分系统,具体可见 https://golang.org/pkg/plugin/
headers object 输出的报头,键名为报头名称,键值为对应的值
static object 静态内容,键名为 URL 地址,键值为对应的文件夹
disableOptions bool 是否禁用 OPTIONS 请求方法
disableHead bool 是否禁用自动生成 HEAD 请求方法
allowedDomains array 限定访问域名,可以是多个,若不指定,表示不限定
readTimeout string 与 http.Server.ReadTimeout 相同
writeTimeout string 与 http.Server.WriteTimeout 相同
idleTimeout string 与 http.Server.IdleTimeout 相同
maxHeaderBytes int 与 http.Server.MaxHeaderBytes 相同
readHeaderTimeout string 与 http.Server.ReadHeaderTimeout 相同
shutdownTimeout string 当请求关闭时,可用于处理剩余请求的时间。
timezone string 时区信息,名称为 IAAN 注册的名称,为空则为 Local
certificates object 多域名的证书信息

详细的介绍可以参考 /internal/webconfig/webconfig.go 文件中的描述

在 debug 模式下,会添加两个调试用的地址:/debug/pprof//debug/vars

logs.xml

logs.xml 采用 logs 包的功能,具体的配置可参考其文档。

字符集

字符集用户无须任何操作,会自动根据 Content-Type 中的 charset 属性自动解析其字符集, 输出时,也会根据 Accept-Charset 报头内容,作自动转换之后再输出。以下字符集都被支持: https://www.iana.org/assignments/character-sets/character-sets.xhtml

媒体类型

默认情况下,框架不会处理任何的 mimetype 类型的数据。需要用户通过 web.CTXServer().AddMarshals()web.CTXServer().AddUnmarshals() 添加相关的处理函数。 添加方式如下:

web := Classic("path")

web.CTXServer().AddMarshals(map[string]mimetype.MarshalFunc{
    "application/json": json.Marshal,
})
web.CTXServer().AddUnmarshals(map[string]mimetype.UnmarshalFunc{
    "application/json": json.Unmarshal,
})
错误处理

框架提供了一种输出错误信息内容的机制,用户只需要实现 Result 接口, 即可自定义输出的错误信息格式。

具体可参考代 result 中的相关代码。

安装

go get github.com/issue9/web

版权

本项目采用 MIT 开源授权许可证,完整的授权说明可在 LICENSE 文件中找到。

Documentation

Overview

Package web 一个微型的 RESTful API 框架

配置文件

配置文件的映射对象在 config.go 文件,其中有各个字段的详细说明。 用户如果需要添加一些自定义的配置项,需要自行再添加其它名称的配置文件, 并通过 config.LoadFile 加载相应的配置文件。

框架了除了本身的 web.yaml 配置文件之外,还有 logs.xml,用于定制日志的相关内容。 具体的日志相关信息,可以访问 https://github.com/issue9/logs 模块。

字符集

字符集用户无须任何操作,会自动根据 `Content-Type` 中的 charset 属性自动解析其字符集, 输出时,也会根据 `Accept-Charset` 报头内容,作自动转换之后再输出。 以下字符集都被支持: https://www.iana.org/assignments/character-sets/character-sets.xhtml

媒体类型

默认情况下,框架不会处理任何的 mimetype 类型的数据。需要用户通过 Web 对象中的 Marshalers 和 Unmarshalers 字段指定相应的解码和编码函数, context/mimetype/ 之下也包含部分已经实现的编解码函数。

返回结果

context 包下的 Result 表示在出错时的输出内容。在使用前,用户需要在 Config.Results 添加各类错误代码。

模块

用户可以把功能相对独立的内容当作一个模块进行封装。框架本身提供了 web.MODServer 对模块进行了依赖管理。用户可以在 web.MODServer.NewModule() 返回对象中, 对模块进行初始化和路由项的添加。所有模块会在 Web.InitModules() 中进行初始化。

Index

Constants

View Source
const (
	LogsFilename   = "logs.xml"
	ConfigFilename = "web.yaml"
)

两个配置文件的名称

View Source
const ContextKeyWeb contextKey = 0

ContextKeyWeb 可以从 http.Request 中获取 Web 实例的关键字

View Source
const Version = version.Version

Version 当前框架的版本

Variables

This section is empty.

Functions

This section is empty.

Types

type Certificate added in v0.32.0

type Certificate struct {
	Cert string `yaml:"cert,omitempty" json:"cert,omitempty" xml:"cert,omitempty"`
	Key  string `yaml:"key,omitempty" json:"key,omitempty" xml:"key,omitempty"`
}

Certificate 证书管理

type Config added in v0.32.0

type Config struct {
	XMLName struct{} `yaml:"-" json:"-" xml:"web"`

	// Debug 调试信息的设置
	Debug *Debug `yaml:"debug,omitempty" json:"debug,omitempty" xml:"debug,omitempty"`

	// Root 网站的根目录所在
	//
	// 比如 https://example.com/api/
	Root string `yaml:"root,omitempty" json:"root,omitempty" xml:"root,omitempty"`

	// Plugins 指定插件,通过 glob 语法指定,比如:~/plugins/*.so
	// 为空表示没有插件。
	//
	// 当前仅支持部分系统:https://golang.org/pkg/plugin/
	Plugins string `yaml:"plugins,omitempty" json:"plugins,omitempty" xml:"plugins,omitempty"`

	// Certificates 网站的域名证书
	//
	// 该设置并不总是生效的,具体的说明可参考 TLSConfig 字段的说明。
	Certificates []*Certificate `yaml:"certificates,omitempty" json:"certificates,omitempty" xml:"certificates,omitempty"`

	// DisableOptions 是否禁用自动生成 OPTIONS 和 HEAD 请求的处理
	DisableOptions bool `yaml:"disableOptions,omitempty" json:"disableOptions,omitempty" xml:"disableOptions,omitempty"`
	DisableHead    bool `yaml:"disableHead,omitempty" json:"disableHead,omitempty" xml:"disableHead,omitempty"`

	// Static 静态内容,键名为 URL 路径,键值为文件地址
	//
	// 比如在 Domain 和 Root 的值分别为 example.com 和 blog 时,
	// 将 Static 的值设置为 /admin ==> ~/data/assets/admin
	// 表示将 example.com/blog/admin/* 解析到 ~/data/assets/admin 目录之下。
	Static Map `yaml:"static,omitempty" json:"static,omitempty" xml:"static,omitempty"`

	// 应用于 http.Server 的几个变量
	ReadTimeout       Duration `yaml:"readTimeout,omitempty" json:"readTimeout,omitempty" xml:"readTimeout,omitempty"`
	WriteTimeout      Duration `yaml:"writeTimeout,omitempty" json:"writeTimeout,omitempty" xml:"writeTimeout,omitempty"`
	IdleTimeout       Duration `yaml:"idleTimeout,omitempty" json:"idleTimeout,omitempty" xml:"idleTimeout,omitempty"`
	ReadHeaderTimeout Duration `yaml:"readHeaderTimeout,omitempty" json:"readHeaderTimeout,omitempty" xml:"readHeaderTimeout,omitempty"`
	MaxHeaderBytes    int      `yaml:"maxHeaderBytes,omitempty" json:"maxHeaderBytes,omitempty" xml:"maxHeaderBytes,omitempty"`

	// 指定关闭服务时的超时时间
	//
	// 如果此值不为 0,则在关闭服务时会调用 http.Server.Shutdown 函数等待关闭服务,
	// 否则直接采用 http.Server.Close 立即关闭服务。
	ShutdownTimeout Duration `yaml:"shutdownTimeout,omitempty" json:"shutdownTimeout,omitempty" xml:"shutdownTimeout,omitempty"`

	// Timezone 时区名称
	//
	// 可以是 Asia/Shanghai 等,具体可参考:
	// https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
	//
	// 为空和 Local(注意大小写) 值都会被初始化本地时间。
	Timezone string `yaml:"timezone,omitempty" json:"timezone,omitempty" xml:"timezone,omitempty"`

	// 用于初始化日志系统的参数
	Logs *lc.Config `yaml:"logs,omitempty" json:"logs,omitempty" xml:"logs,omitempty"`

	// Catalog 本地化消息的管理组件
	//
	// 为空的情况下会引用 golang.org/x/text/message.DefaultCatalog 对象。
	//
	// golang.org/x/text/message/catalog 提供了 NewBuilder 和 NewFromMap
	// 等方式构建 Catalog 接口实例。
	Catalog catalog.Catalog `yaml:"-" json:"-" xml:"-"`

	Marshalers         map[string]mimetype.MarshalFunc   `yaml:"-" json:"-" xml:"-"`
	Unmarshalers       map[string]mimetype.UnmarshalFunc `yaml:"-" json:"-" xml:"-"`
	ResultBuilder      context.BuildResultFunc           `yaml:"-" json:"-" xml:"-"`
	ContextInterceptor func(*context.Context)            `yaml:"-" json:"-" xml:"-"`

	// TLSConfig 指定 https 模式下的证书配置项
	//
	// 如果用户指定了 Certificates 字段,则会根据此字段生成,
	// 用户也可以自已覆盖此值,比如采用 golang.org/x/crypto/acme/autocert.Manager.TLSConfig
	// 配置 Let's Encrypt。
	TLSConfig *tls.Config `yaml:"-" json:"-" xml:"-"`

	// 返回给用户的错误提示信息
	//
	// 对键名作了一定的要求:要求最高的三位数必须是一个 HTTP 状态码,
	// 比如 40001,在返回给客户端时,会将 400 作为状态码展示给用户,
	// 同时又会将 40001 和对应的消息发送给用户。
	//
	// 该数据最终由 context.Server.AddMessages 添加。
	Results map[int]string `yaml:"-" json:"-" xml:"-"`

	// 指定用于触发关闭服务的信号
	//
	// 如果为 nil,表示未指定任何信息,如果是长度为 0 的数组,则表示任意信号,
	// 如果指定了多个相同的值,则该信号有可能多次触发。
	ShutdownSignal []os.Signal `yaml:"-" json:"-" xml:"-"`
	// contains filtered or unexported fields
}

Config 提供了初始化 Web 对象的基本参数

func LoadConfig

func LoadConfig(dir string) (conf *Config, err error)

LoadConfig 加载指定目录下的配置文件用于初始化 *Config 实例

当前加后的 conf.Logs == nil 时,会将 dir 目录下的 logs.xml 当作实例加载。

type Context

type Context = context.Context

Context 定义了在单个 HTTP 请求期间的上下文环境

是对 http.ResponseWriter 和 http.Request 的简单包装。

type Debug added in v0.18.0

type Debug struct {
	Pprof string `yaml:"pprof,omitempty" json:"pprof,omitempty" xml:"pprof,omitempty"`
	Vars  string `yaml:"vars,omitempty" json:"vars,omitempty" xml:"vars,omitempty"`
}

Debug 调试信息的配置

type Duration added in v0.32.0

type Duration time.Duration

Duration 封装 time.Duration,实现 JSON、XML 和 YAML 的解析

func (Duration) Duration added in v0.32.0

func (d Duration) Duration() time.Duration

Duration 转换成 time.Duration

func (Duration) MarshalJSON added in v0.32.0

func (d Duration) MarshalJSON() ([]byte, error)

MarshalJSON json.Marshaler 接口

func (Duration) MarshalXML added in v0.32.0

func (d Duration) MarshalXML(e *xml.Encoder, start xml.StartElement) error

MarshalXML xml.Marshaler 接口

func (Duration) MarshalYAML added in v0.32.0

func (d Duration) MarshalYAML() (interface{}, error)

MarshalYAML yaml.Marshaler 接口

func (*Duration) UnmarshalJSON added in v0.32.0

func (d *Duration) UnmarshalJSON(b []byte) error

UnmarshalJSON json.Unmarshaler 接口

func (*Duration) UnmarshalXML added in v0.32.0

func (d *Duration) UnmarshalXML(de *xml.Decoder, start xml.StartElement) error

UnmarshalXML xml.Unmarshaler 接口

func (*Duration) UnmarshalYAML added in v0.32.0

func (d *Duration) UnmarshalYAML(u func(interface{}) error) error

UnmarshalYAML yaml.Unmarshaler 接口

type MODServer added in v0.32.0

type MODServer = module.Server

MODServer 模块的管理服务

type Map added in v0.32.0

type Map map[string]string

Map 定义 map[string]string 类型

唯一的功能是为了 xml 能支持 map。

func (Map) MarshalXML added in v0.32.0

func (p Map) MarshalXML(e *xml.Encoder, start xml.StartElement) error

MarshalXML implement xml.Marshaler

func (*Map) UnmarshalXML added in v0.32.0

func (p *Map) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error

UnmarshalXML implement xml.Unmarshaler

type Module

type Module = module.Module

Module 定义了模块的相关信息

type Result

type Result = context.Result

Result 定义了返回给用户的错误信息

type SchedulerFunc added in v0.28.0

type SchedulerFunc = module.JobFunc

SchedulerFunc 计划任务的执行函数签名

type Service added in v0.25.0

type Service = module.Service

Service 常驻后台运行的服务描述

type ServiceFunc added in v0.25.3

type ServiceFunc = module.ServiceFunc

ServiceFunc 服务的执行函数签名

type Web added in v0.32.0

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

Web 管理整个项目所有实例

func Classic added in v0.25.0

func Classic(dir string) (*Web, error)

Classic 返回一个开箱即用的 Web 实例

会加载 dir 目录下的 web.yaml 和 logs.xml 两个配置文件内容,并用于初始化 Web 实例。

func GetWeb added in v0.32.0

func GetWeb(ctx *Context) *Web

GetWeb 从 ctx 中获取 *Web 实例

func New added in v0.32.0

func New(conf *Config) (web *Web, err error)

New 根据内容进行初始化 Web 对象

func (*Web) CTXServer added in v0.32.0

func (web *Web) CTXServer() *context.Server

CTXServer 返回 context.Server 实例

func (*Web) Close added in v0.32.0

func (web *Web) Close() error

Close 关闭服务

func (*Web) HTTPServer added in v0.32.0

func (web *Web) HTTPServer() *http.Server

HTTPServer 返回 http.Server 实例

func (*Web) InitModules added in v0.32.0

func (web *Web) InitModules(tag string) error

InitModules 初始化模块

func (*Web) Modules added in v0.32.0

func (web *Web) Modules() []*Module

Modules 返回模块列表

func (*Web) Serve added in v0.32.0

func (web *Web) Serve() (err error)

Serve 运行 HTTP 服务

func (*Web) Services added in v0.32.0

func (web *Web) Services() []*Service

Services 返回服务列表

func (*Web) Tags added in v0.32.0

func (web *Web) Tags() map[string][]string

Tags 返回所有标签列表

键名为模块名称,键值为该模块下的标签列表。

Directories

Path Synopsis
cmd
web
简单的辅助功能命令行工具
简单的辅助功能命令行工具
Package config 提供了加载配置项内容的各类方法
Package config 提供了加载配置项内容的各类方法
Package context 用于处理单个请求的上下文关系
Package context 用于处理单个请求的上下文关系
mimetype
Package mimetype 提供对各类媒体数据的处理
Package mimetype 提供对各类媒体数据的处理
mimetype/form
Package form 用于处理 www-form-urlencoded 编码 func read(ctx *web.Context) { vals := urls.Values{} ctx.Read(vals) } func write(ctx *web.Context) { vals := urls.Values{} vals.Add("name", "caixw") ctx.Render(http.StatusOK, vals, nil) } form 用户可以通过定义 form 标签自定义输出的名称,比如: type Username struct { Name string `form:"name"` Age int } 转换成 form-data 可能是以下样式: name=jjj&age=18 该方式对数据类型有一定限制: 1.
Package form 用于处理 www-form-urlencoded 编码 func read(ctx *web.Context) { vals := urls.Values{} ctx.Read(vals) } func write(ctx *web.Context) { vals := urls.Values{} vals.Add("name", "caixw") ctx.Render(http.StatusOK, vals, nil) } form 用户可以通过定义 form 标签自定义输出的名称,比如: type Username struct { Name string `form:"name"` Age int } 转换成 form-data 可能是以下样式: name=jjj&age=18 该方式对数据类型有一定限制: 1.
mimetype/gob
Package gob 提供 GOB 格式的编解码
Package gob 提供 GOB 格式的编解码
mimetype/html
Package html 提供输出 HTML 内容的 mimetype.MarshalFunc 函数。
Package html 提供输出 HTML 内容的 mimetype.MarshalFunc 函数。
mimetype/mimetypetest
Package mimetypetest 针对文本内容的编解码实现,仅作为测试用例。
Package mimetypetest 针对文本内容的编解码实现,仅作为测试用例。
internal
cmd/build
Package build 提供编译相关的功能
Package build 提供编译相关的功能
cmd/create
Package create 用于创建新项目的子命令
Package create 用于创建新项目的子命令
cmd/release
Package release 发布版本号管理
Package release 发布版本号管理
cmd/version
Package version 显示版本号信息
Package version 显示版本号信息
cmd/watch
Package watch 提供热编译功能。
Package watch 提供热编译功能。
filesystem
Package filesystem 提供与文件系统相关的操作
Package filesystem 提供与文件系统相关的操作
plugintest
Package plugintest 作为插件的功能测试包 NOTE: 该功能如果直接写在 module 包之下,目前版本会报错。
Package plugintest 作为插件的功能测试包 NOTE: 该功能如果直接写在 module 包之下,目前版本会报错。
version
Package version 版本定义
Package version 版本定义
versioninfo
Package versioninfo 提供对版本信息的一些操作
Package versioninfo 提供对版本信息的一些操作
Package module 提供模块管理的相关功能
Package module 提供模块管理的相关功能

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL
JackTT - Gopher 🇻🇳