API 利器 —— Faygo Web 框架

henrylee2cn發表於2017-02-25

Faygo

Faygo 使用全新架構,是最合適開發API介面的Go Web框架。使用者只需定義一個struct Handler,就能自動繫結、驗證請求引數並生成線上API文件。

Faygo Favicon

官方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介面(funcstruct型別),共同構成路由操作鏈,只是概念層面的說法不同
  • 支援多種網路型別:
網路型別 配置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進行配置來避免不必要的重新編譯,並且這些配置檔案支援自動補填預設值
  • 提供 gormxormsqlxdirectSQLWebsocketinihttp 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% ... 3Dxyz
response:
    {
        "Id": 1,
        "Title": "test",
        "Paragraph": [
            "abc",
            "xyz"
        ],
        "Cookie": "2016-11-13 01:14:40.9038005 +0800 CST"
    }
*/

示例庫

開源協議

Faygo 專案採用商業應用友好的 Apache2.0 協議釋出。

相關文章