Faygo GoDoc Faygo goreportcard

Faygo Favicon

概述

Faygo 使用全新架构,是最合适开发API接口的Go Web框架。用户只需定义一个struct Handler,就能自动绑定、验证请求参数并生成在线API文档。

官方QQ群:Go-Web 编程 42730308 Go-Web 编程群

查看《用户手册》

faygo index

faygo apidoc

faygo server

最新版本

版本号

v1.0

安装要求

Go Version ≥1.8

快速使用

  • 方式一 源码下载
go get -u -v github.com/henrylee2cn/faygo
go get -u -v github.com/henrylee2cn/fay
        fay command [arguments] 
 
The commands are: 
        new        创建、编译和运行(监控文件变化)一个新的faygo项目 
        run        编译和运行(监控文件变化)任意一个已存在的golang项目 
 
fay new appname [apptpl] 
        appname    指定新faygo项目的创建目录 
        apptpl     指定一个faygo项目模板(可选) 
 
fay run [appname] 
        appname    指定待运行的golang项目路径(可选)

框架特性

  • 一个 struct Handler 搞定多件事:

    • 定义 Handler/Middleware
    • 绑定与验证请求参数
    • 生成 Swagger2.0 API 在线文档
    • 数据库 ORM 映射
  • Handler与Middleware完全相同,都是实现Handler接口(func或struct类型),共同构成路由操作链,只是概念层面的说法不同

  • 支持多种网络类型:
网络类型 配置net_types值
HTTP http
HTTPS/HTTP2(TLS) https
HTTPS/HTTP2(Let’s Encrypt TLS) letsencrypt
HTTPS/HTTP2(Let’s Encrypt TLS on UNIX socket) unix_letsencrypt
HTTP(UNIX socket) unix_http
HTTPS/HTTP2(TLS on UNIX socket) unix_https

- 支持单服务单监听、单服务多监听、多服务多监听等,多个服务的配置信息相互独立
- 基于 httprouter 开发高性能路由,支持链式与树形两种注册风格,支持灵活的静态文件路由(如DirFS、RenderFS、MarkdownFS等)
- 支持平滑关闭、平滑升级,提供fay工具进行新建项目、热编译、元编程
- 采用最强大的 pongo2 作为HTML渲染引擎
- 提供近似LRU的文件缓存功能,主要用途是静态文件缓存
- 跨平台的彩色日志系统,且同时支持console和file两种输出形式(可以同时使用)
- 提供Session管理功能
- 支持Gzip全局配置
- 提供XSRF跨站请求伪造安全过滤
- 大多数功能尽量使用简洁的ini进行配置来避免不必要的重新编译,并且这些配置文件支持自动补填默认值
- 提供 gorm、xorm、sqlx、directSQL、Websocket、ini 、http client 等很多常用扩展包

faygo struct handler 多重用途合一

简单示例

package main 
 
import ( 
    // "mime/multipart" 
    "time" 
    "github.com/henrylee2cn/faygo" 
) 
 
type Index struct { 
    Id        int      `param:"<in:path> <required> <desc:ID> <range: 0:10>"` 
    Title     string   `param:"<in:query> <nonzero>"` 
    Paragraph []string `param:"<in:query> <name:p> <len: 1:10> <regexp: ^[\\w]*$>"` 
    Cookie    string   `param:"<in:cookie> <name:faygoID>"` 
    // Picture         *multipart.FileHeader `param:"<in:formData> <name:pic> <maxmb:30>"` 
} 
 
func (i *Index) Serve(ctx *faygo.Context) error { 
    if ctx.CookieParam("faygoID") == "" { 
        ctx.SetCookie("faygoID", time.Now().String()) 
    } 
    return ctx.JSON(200, i) 
} 
 
func main() { 
    app := faygo.New("myapp", "0.1") 
 
    // Register the route in a chain style 
    app.GET("/index/:id", new(Index)) 
 
    // Register the route in a tree style 
    // app.Route( 
    //     app.NewGET("/index/:id", new(Index)), 
    // ) 
 
    // Start the service 
    faygo.Run() 
} 
 
/* 
http GET: 
    http://localhost:8080/index/1?title=test&p=abc&p=xyz 
response: 
    { 
        "Id": 1, 
        "Title": "test", 
        "Paragraph": [ 
            "abc", 
            "xyz" 
        ], 
        "Cookie": "2016-11-13 01:14:40.9038005 +0800 CST" 
    } 
*/

示例库

操作和中间件

操作和中间件是相同的,都是实现了Handler接口!

  • 函数类型
// 不含API文档描述 
func Page() faygo.HandlerFunc { 
    return func(ctx *faygo.Context) error { 
        return ctx.String(200, "faygo") 
    } 
} 
 
// 含API文档描述 
var Page2 = faygo.WrapDoc(Page(), "测试页2的注意事项", "文本")
  • 结构体类型
// Param操作通过Tag绑定并验证请求参数 
type Param struct { 
    Id    int    `param:"<in:path> <required> <desc:ID> <range: 0:10>"` 
    Title string `param:"<in:query>"` 
} 
 
// Serve实现Handler接口 
func (p *Param) Serve(ctx *faygo.Context) error { 
    return ctx.JSON(200, 
        faygo.Map{ 
            "Struct Params":    p, 
            "Additional Param": ctx.PathParam("additional"), 
        }, true) 
} 
 
// Doc实现API文档接口(可选) 
func (p *Param) Doc() faygo.Doc { 
    return faygo.Doc{ 
        // 向API文档声明接口注意事项 
        Note: "param desc", 
        // 向API文档声明响应内容格式 
        Return: faygo.JSONMsg{ 
            Code: 1, 
            Info: "success", 
        }, 
        // 向API文档增加额外的请求参数声明(可选) 
        Params: []faygo.ParamInfo{ 
            { 
                Name:  "additional", 
                In:    "path", 
                Model: "a", 
                Desc:  "defined by the `Doc()` method", 
            }, 
        }, 
    } 
}

过滤函数

过滤函数必须是HandlerFunc类型!

func Root2Index(ctx *faygo.Context) error { 
    // 不允许直接访问`/index` 
    if ctx.Path() == "/index" { 
        ctx.Stop() 
        return nil 
    } 
    if ctx.Path() == "/" { 
        ctx.ModifyPath("/index") 
    } 
    return nil 
}

路由注册

  • 树状
// 新建应用服务,参数:名称、版本 
var app1 = faygo.New("myapp1", "1.0") 
 
// 路由 
app1.Filter(Root2Index). 
    Route( 
        app1.NewNamedGET("测试页1", "/page", Page()), 
        app1.NewNamedGET("测试页2", "/page2", Page2), 
        app1.NewGroup("home", 
            app1.NewNamedGET("test param", "/param", &Param{ 
                // 为绑定的参数设定API文档中缺省值(可选) 
                Id:    1, 
                Title: "test param", 
            }), 
        ), 
    )
  • 链状
// 新建应用服务,参数:名称、版本 
var app2 = faygo.New("myapp2", "1.0") 
 
// 路由 
app2.Filter(Root2Index) 
app2.NamedGET("test page", "/page", Page()) 
app2.NamedGET("test page2", "/page2", Page2) 
app2.Group("home") 
{ 
    app2.NamedGET("test param", "/param", &Param{ 
        // 为绑定的参数设定API文档中缺省值(可选) 
        Id:    1, 
        Title: "test param", 
    }) 
}

平滑关闭与重启

  • 平滑关闭
kill [pid]
  • 平滑重启
kill -USR2 [pid]

扩展包

扩展包 导入路径
各种条码 github.com/henrylee2cn/faygo/ext/barcode
比特单位 github.com/henrylee2cn/faygo/ext/bitconv
gorm数据库引擎 github.com/henrylee2cn/faygo/ext/db/gorm
sqlx数据库引擎 github.com/henrylee2cn/faygo/ext/db/sqlx
xorm数据库引擎 github.com/henrylee2cn/faygo/ext/db/xorm
directSQL(配置化SQL引擎) github.com/henrylee2cn/faygo/ext/db/directsql
口令算法 github.com/henrylee2cn/faygo/ext/otp
UUID github.com/henrylee2cn/faygo/ext/uuid
Websocket github.com/henrylee2cn/faygo/ext/websocket
ini配置 github.com/henrylee2cn/faygo/ini
定时器 github.com/henrylee2cn/faygo/ext/cron
任务工具 github.com/henrylee2cn/faygo/ext/task
HTTP客户端 github.com/henrylee2cn/faygo/ext/surfer

开源协议

Faygo 项目采用商业应用友好的 Apache2.0 协议发布。

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Python语言相关术语汇总详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。