web

package module
v0.29.0 Latest Latest
Warning

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

Go to latest
Published: May 30, 2019 License: MIT Imports: 25 Imported by: 69

README

web Build Status Go version Go Report Card license codecov

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

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

package main

import "github.com/issue9/web"

// main.go
func main() {
    web.Classic("./appconfig/web.yaml")
    web.AddMessages(400, map[int]string{...})

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

    web.Fatal(2, web.Serve())
}

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

// modules/m2/module.go
func Init() {
    web.NewModule("m2", "模块描述信息", "m1").
        GetFunc("/admins", getAdmins).
        GetFunc("/groups", getGroups)
}
项目结构

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

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

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

package m1

import "github.com/issue9/web"

m := web.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 是否启用调试模式
domain string 项目的域名,若存在 allowedDomains 同时会加入到 allowedDomains 字段中
root string 项目的根路径,比如 /blog
plugins string 指定需要加载的插件,可以使用 glob 模式,仅支持部分系统,具体可见 https://golang.org/pkg/plugin/
https bool 是否启用 HTTPS
certFile string 当启用 HTTPS 时的 cert 文件
keyFile string 当启用 HTTPS 时的 key 文件
port int 监听的端口号
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 相同
compress array 指定可以使用 accept-encoding 输出的 mimetype 值
url string 网站首页地址,一般由 domain、root 和 port 自动拼成,但也有可能存在类似于反向代理的情况,需要自行指定不同的值。
timezone string 时区信息,名称为 IAAN 注册的名称

详细的介绍可以参考 /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 类型的数据。需要用户通过 Mimetypes().AddMarshals()Mimetypes().AddUnmarshals() 添加相关的处理函数。 添加方式如下:

Mimetypes().AddMarshals(map[string]mimetype.MarshalFunc{
    "application/json": json.Marshal,
})
Mimetypes().AddUnmarshals(map[string]mimetype.UnmarshalFunc{
    "application/json": json.Unmarshal,
})

之后,通过 web.NewContext() 获得的 Context 对象,会根据用户的 AcceptContent-Type 自动使用相应的解析和输出格式。

当然用户也可以直接构建一个 Context 对象来生成一个一次性的对象。

错误处理

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

具体可参考代 internal/resulttest 中的相关代码。

安装
go get github.com/issue9/web

同时还提供了一个辅助工具 web,可通过调用 ./build/web.sh 进行编译。

文档

Go Walker GoDoc

版权

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

Documentation

Overview

Package web 一个微型的 RESTful API 框架。

配置文件

配置文件的映射对象在 internal/webconfig 包中,其中有各个字段的详细说明。 用户如果需要添加一些自定义的配置项,需要自行再添加其它名称的配置文件, 文件地址最好通过 web.File 来获取,这样可以和框架本身的配置文件存在同一目录下。

框架了除了本身的 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 类型的数据。需要用户通过 Mimetypes().AddMarshals() 和 Mimetypes().AddUnmarshals() 添加相关的处理函数。 添加方式如下:

Mimetypes().AddMarshals(map[string]mimetype.MarshalFunc{
    "application/json": json.Marshal,
})
Mimetypes().AddUnmarshals(map[string]mimetype.UnmarshalFunc{
    "application/json": json.Unmarshal,
})

之后,通过 web.NewContext() 获得的 context 对象,会根据用户的 Accept 和 Content-Type 自动使用相应的解析和输出格式。

当然用户也可以直接构建一个 context.Context 对象来生成一个一次性的对象。

返回结果

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

模块

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

Index

Constants

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

两个配置文件的名称。

在 Classic 中,采用了这两个文件名作为日志和框架的配置文件名。

View Source
const Version = version.Version

Version 当前框架的版本

Variables

This section is empty.

Functions

func AddCompresses added in v0.25.0

func AddCompresses(m map[string]compress.WriterFunc) error

AddCompresses 添加压缩处理函数

func AddMessages added in v0.26.0

func AddMessages(status int, messages map[int]string)

AddMessages 添加新的错误消息代码

func AddMiddlewares added in v0.18.0

func AddMiddlewares(m middleware.Middleware)

AddMiddlewares 设置全局的中间件,可多次调用。

func App added in v0.18.0

func App() *app.App

App 返回 defaultApp 实例

func CRITICAL added in v0.18.0

func CRITICAL() *log.Logger

CRITICAL 获取 CRITICAL 级别的 log.Logger 实例,在未指定 critical 级别的日志时,该实例返回一个 nil。

func Classic added in v0.25.0

func Classic(dir string, get app.GetResultFunc) error

Classic 初始化一个可运行的框架环境

dir 为配置文件的根目录

func Close

func Close() error

Close 关闭服务。

无论配置文件如果设置,此函数都是直接关闭服务,不会等待。

func Critical added in v0.18.0

func Critical(v ...interface{})

Critical 相当于 CRITICAL().Println(v...)的简写方式

func Criticalf added in v0.18.0

func Criticalf(format string, v ...interface{})

Criticalf 相当于 CRITICAL().Printf(format, v...) 的简写方式

func DEBUG added in v0.18.0

func DEBUG() *log.Logger

DEBUG 获取 DEBUG 级别的 log.Logger 实例,在未指定 debug 级别的日志时,该实例返回一个 nil。

func Debug added in v0.18.0

func Debug(v ...interface{})

Debug 相当于 DEBUG().Println(v...) 的简写方式

func Debugf added in v0.18.0

func Debugf(format string, v ...interface{})

Debugf 相当于 DEBUG().Printf(format, v...) 的简写方式

func ERROR added in v0.18.0

func ERROR() *log.Logger

ERROR 获取 ERROR 级别的 log.Logger 实例,在未指定 error 级别的日志时,该实例返回一个 nil。

func Error added in v0.18.0

func Error(v ...interface{})

Error 相当于 ERROR().Println(v...) 的简写方式

func ErrorHandlers added in v0.25.3

func ErrorHandlers() *errorhandler.ErrorHandler

ErrorHandlers 错误处理功能

func Errorf added in v0.18.0

func Errorf(format string, v ...interface{})

Errorf 相当于 ERROR().Printf(format, v...) 的简写方式

func Fatal added in v0.18.0

func Fatal(code int, v ...interface{})

Fatal 输出错误信息,然后退出程序。

func Fatalf added in v0.18.0

func Fatalf(code int, format string, v ...interface{})

Fatalf 输出错误信息,然后退出程序。

func File

func File(path string) string

File 获取配置目录下的文件。

func Grace

func Grace(dur time.Duration, sig ...os.Signal)

Grace 指定触发 Shutdown() 的信号,若为空,则任意信号都触发。

多次调用,则每次指定的信号都会起作用,如果由传递了相同的值, 则有可能多次触发 Shutdown()。

NOTE: 传递空值,与不调用,其结果是不同的。 若是不调用,则不会处理任何信号;若是传递空值调用,则是处理任何要信号。

func INFO added in v0.18.0

func INFO() *log.Logger

INFO 获取 INFO 级别的 log.Logger 实例,在未指定 info 级别的日志时,该实例返回一个 nil。

func Info added in v0.18.0

func Info(v ...interface{})

Info 相当于 INFO().Println(v...) 的简写方式 Info 函数默认是带换行符的,若需要不带换行符的,请使用 DEBUG().Print() 函数代替。 其它相似函数也有类型功能。

func Infof added in v0.18.0

func Infof(format string, v ...interface{})

Infof 相当于 INFO().Printf(format, v...) 的简写方式

func Init

func Init(mgr *config.Manager, configFilename string, get app.GetResultFunc) error

Init 初始化整个应用环境

构建了一个最基本的服务器运行环境,大部分内容采用默认设置。 比如日志为不输出任何内容,如有需要,要调用 Logs() 进行输出通道的设置; 也不会解析任意的 content-type 内容的数据,需要通过 Mimetype 进行进一步的设置。

mgr 为配置文件管理工具; configFilename 为相对于 mgr 目录下的配置文件地址。

重复调用会直接 panic

func InitModules added in v0.23.0

func InitModules(tag string) error

InitModules 初始化所有的模块或是模块下指定标签名称的函数。

若指定了 tag 参数,则只初始化该名称的子模块内容。

func IsDebug

func IsDebug() bool

IsDebug 是否处在调试模式

func Load added in v0.18.0

func Load(r io.Reader, typ string, v interface{}) error

Load 加载指定的配置文件内容到 v 中

func LoadFile added in v0.18.0

func LoadFile(path string, v interface{}) error

LoadFile 加载指定的配置文件内容到 v 中

func Location added in v0.26.0

func Location() *time.Location

Location 返回当前配置文件中指定的时区信息

func Messages added in v0.21.0

func Messages(p *message.Printer) map[int]string

Messages 获取所有的错误消息代码

p 用于返回特定语言的内容。如果为空,则表示返回原始值。

func Mimetypes added in v0.20.0

func Mimetypes() *mimetype.Mimetypes

Mimetypes 返回 mimetype.Mimetypes

func Mux added in v0.16.1

func Mux() *mux.Mux

Mux 返回 mux.Mux 实例。

func Now added in v0.26.0

func Now() time.Time

Now 返回当前时间。

与 time.Now() 的区别在于 Now() 基于当前时区

func Panic added in v0.18.0

func Panic(v ...interface{})

Panic 输出错误信息,然后触发 panic。

func Panicf added in v0.18.0

func Panicf(format string, v ...interface{})

Panicf 输出错误信息,然后触发 panic。

func ParseTime added in v0.26.0

func ParseTime(layout, value string) (time.Time, error)

ParseTime 分析时间格式,基于当前时间

func Path added in v0.22.0

func Path(path string) string

Path 构建 URL 的 Path 部分

func Scheduled added in v0.27.0

func Scheduled() *scheduled.Server

Scheduled 获取 scheduled.Server 实例

func Schedulers added in v0.27.0

func Schedulers() []*scheduled.Job

Schedulers 返回所有的计划任务

func Serve

func Serve() error

Serve 执行监听程序。

func Services added in v0.25.0

func Services() []*app.Service

Services 返回所有的服务列表

func Shutdown

func Shutdown(ctx context.Context) error

Shutdown 关闭所有服务。

根据配置文件中的配置项,决定当前是直接关闭还是延时之后关闭。

func TRACE added in v0.18.0

func TRACE() *log.Logger

TRACE 获取 TRACE 级别的 log.Logger 实例,在未指定 trace 级别的日志时,该实例返回一个 nil。

func Trace added in v0.18.0

func Trace(v ...interface{})

Trace 相当于 TRACE().Println(v...) 的简写方式

func Tracef added in v0.18.0

func Tracef(format string, v ...interface{})

Tracef 相当于 TRACE().Printf(format, v...) 的简写方式

func URL

func URL(path string) string

URL 构建一条完整 URL

func Uptime added in v0.29.0

func Uptime() time.Time

Uptime 启动的时间

时区信息与配置文件中的相同

func WARN added in v0.18.0

func WARN() *log.Logger

WARN 获取 WARN 级别的 log.Logger 实例,在未指定 warn 级别的日志时,该实例返回一个 nil。

func Warn added in v0.18.0

func Warn(v ...interface{})

Warn 相当于 WARN().Println(v...) 的简写方式

func Warnf added in v0.18.0

func Warnf(format string, v ...interface{})

Warnf 相当于 WARN().Printf(format, v...) 的简写方式

Types

type Context

type Context = context.Context

Context 一般在 http.ServeHTTP 中根据 http.ResponseWriter 和 http.Request 初始化获得。 可以在整个函数生命周期中操作相关功能。

等同于 context.Context,方便调用者使用

func NewContext

func NewContext(w http.ResponseWriter, r *http.Request) *Context

NewContext 生成 *Context 对象,若是出错则 panic

type Module

type Module = module.Module

Module 等同于 module.Module,方便调用者使用

func Modules

func Modules() []*Module

Modules 当前系统使用的所有模块信息

func NewModule

func NewModule(name, desc string, deps ...string) *Module

NewModule 声明一个新的模块

name 模块名称,需要全局唯一; desc 模块的详细信息; deps 表示当前模块的依赖模块名称,可以是插件中的模块名称。

type Result

type Result = app.Result

Result 等同于 app.Result,方便调用者使用

type SchedulerFunc added in v0.28.0

type SchedulerFunc = scheduled.JobFunc

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

等同于 scheduled.JobFunc,方便调用者使用

type ServiceFunc added in v0.25.3

type ServiceFunc = app.ServiceFunc

ServiceFunc 服务的报告函数签名。

等同于 app.ServiceFunc,方便调用者使用

type Tag added in v0.28.0

type Tag = module.Tag

Tag 等同于 module.Tag,方便调用者使用

Directories

Path Synopsis
Package app 核心功能的实现
Package app 核心功能的实现
cmd
web
简单的辅助功能命令行工具。
简单的辅助功能命令行工具。
Package context 用于处理单个请求的上下文关系。
Package context 用于处理单个请求的上下文关系。
internal
cmd/build
Package build 编译程,直接引用 go build
Package build 编译程,直接引用 go 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 提供热编译功能。
plugintest
Package plugintest 作为插件的功能测试包 NOTE: 该功能如果直接写在 module 包之下,目前版本会报错。
Package plugintest 作为插件的功能测试包 NOTE: 该功能如果直接写在 module 包之下,目前版本会报错。
resulttest
Package resulttest 提供了 app.Result 接口的默认实现,方便测试用。
Package resulttest 提供了 app.Result 接口的默认实现,方便测试用。
version
Package version 版本定义
Package version 版本定义
versioninfo
Package versioninfo 提供对版本信息的一些操作
Package versioninfo 提供对版本信息的一些操作
webconfig
Package webconfig 配置文件对应的内容。
Package webconfig 配置文件对应的内容。
Package mimetype 提供了对编码的支持。
Package mimetype 提供了对编码的支持。
form
Package form 用于处理 www-form-urlencoded 编码 func read(w http.ResponseWriter, r *http.Request) { ctx := web.New(w, r) vals := urls.Values{} !ctx.Read(vals) } func write(w http.ResponseWriter, r *http.Request) { ctx := web.New(w, r) vals := urls.Values{} vals.Add("name", "caixw") ctx.Render(http.StatusOK, vals, nil) }
Package form 用于处理 www-form-urlencoded 编码 func read(w http.ResponseWriter, r *http.Request) { ctx := web.New(w, r) vals := urls.Values{} !ctx.Read(vals) } func write(w http.ResponseWriter, r *http.Request) { ctx := web.New(w, r) vals := urls.Values{} vals.Add("name", "caixw") ctx.Render(http.StatusOK, vals, nil) }
gob
Package gob 提供 GOB 格式的编解码
Package gob 提供 GOB 格式的编解码
html
Package html 提供输出 HTML 内容的 mimetype.MarshalFunc 函数。
Package html 提供输出 HTML 内容的 mimetype.MarshalFunc 函数。
mimetypetest
Package mimetypetest 针对文本内容的编解码实现,仅作为测试用例。
Package mimetypetest 针对文本内容的编解码实现,仅作为测试用例。
protobuf
Package protobuf 提供对 Google protocol buffers 的支持
Package protobuf 提供对 Google protocol buffers 的支持
Package module 模块的管理
Package module 模块的管理

Jump to

Keyboard shortcuts

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