Faygo 一款最適合開發 API 的 Go Web 框架

Faygo 框架

Faygo 使用全新架構,是最合適開發API接口的Go Web框架。用戶只需定義一個struct Handler,就能自動綁定、驗證請求參數并生成在線API文檔。

faygo index

faygo apidoc

faygo server

安裝要求

Go Version ≥1.8

快速使用

  • 方式一 源碼下載
go get -u -v github.com/henrylee2cn/faygo
  • 方式二 部署工具 ( Go to fay )
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項目路徑(可選)</code></pre>

框架特性

  • 一個 struct Handler 搞定多件事:

    • 定義 Handler/Middleware
    • 綁定與驗證請求參數
    • 生成 Swagger2.0 API 在線文檔
    • 數據庫 ORM 映射
    </li>
  • Handler與Middleware完全相同,都是實現Handler接口( func 或 struct 類型),共同構成路由操作鏈,只是概念層面的說法不同

  • 支持多種網絡類型:
  • </ul>
    網絡類型 配置 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:"&lt;in:path&gt; &lt;required&gt; &lt;desc:ID&gt; &lt;range: 0:10&gt;" Title string param:"&lt;in:query&gt; &lt;nonzero&gt;" Paragraph []string param:"&lt;in:query&gt; &lt;name:p&gt; &lt;len: 1:10&gt; &lt;regexp: ^[\\w]*$&gt;" Cookie string param:"&lt;in:cookie&gt; &lt;name:faygoID&gt;" // Picture *multipart.FileHeader param:"&lt;in:formData&gt; &lt;name:pic&gt; &lt;maxmb:30&gt;" }

    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" }/</code></pre>

    操作和中間件

    操作和中間件是相同的,都是實現了Handler接口!

    • 函數類型
    // 不含API文檔描述
    func Page() faygo.HandlerFunc {
        return func(ctx *faygo.Context) error {
            return ctx.String(200, "faygo")
        }
    }

    // 含API文檔描述 var Page2 = faygo.WrapDoc(Page(), "測試頁2的注意事項", "文本")</code></pre>

    • 結構體類型
    // Param操作通過Tag綁定并驗證請求參數
    type Param struct {
        Id    int    param:"&lt;in:path&gt; &lt;required&gt; &lt;desc:ID&gt; &lt;range: 0:10&gt;"
        Title string param:"&lt;in:query&gt;"
    }

    // 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", }, }, } }</code></pre>

    過濾函數

    過濾函數必須是HandlerFunc類型!

    func Root2Index(ctx faygo.Context) error {
        // 不允許直接訪問/index
        if ctx.Path() == "/index" {
            ctx.Stop()
            return nil
        }
        if ctx.Path() == "/" {
            ctx.ModifyPath("/index")
        }
        return nil
    }</code></pre> 
      

    路由注冊

    • 樹狀
    // 新建應用服務,參數:名稱、版本
    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", }), ), )</code></pre>

    • 鏈狀
    // 新建應用服務,參數:名稱、版本
    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", }) }</code></pre>

    平滑關閉與重啟

    • 平滑關閉
    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 協議發布。

     

    來自:http://www.jianshu.com/p/f40b65ccf7a5

     

 本文由用戶 v10yjjngf 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!