Home

Awesome

Faygo report card github issues github closed issues GitHub release GoDoc view Go网络编程群

Faygo Favicon

Faygo is a fast and concise Go Web framework that can be used to develop high-performance web app(especially API) with fewer codes. Just define a struct Handler, Faygo will automatically bind/verify the request parameters and generate the online API doc. Go to <User Manual>

简体中文

faygo index

faygo apidoc

faygo server

Latest version

Version

v1.2.0

Requirements

Go Version ≥ 1.8

Quick Start

go get -u -v github.com/andeya/faygo
go get -u -v github.com/andeya/fay
        fay command [arguments]

The commands are:
        new        create, compile and run (monitor changes) a new faygo project
        run        compile and run (monitor changes) an any existing go project

fay new appname [apptpl]
        appname    specifies the path of the new faygo project
        apptpl     optionally, specifies the faygo project template type

fay run [appname]
        appname    optionally, specifies the path of the new project

Features

Network typesConfiguration net_types
HTTPhttp
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

faygo handler multi-usage

Simple example

package main

import (
    // "mime/multipart"
    "time"
    "github.com/andeya/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"
    }
*/

All samples

Handler and middleware

Handler and middleware are the same, both implemente Handler interface!

// Page handler doesn't contains API doc description
func Page() faygo.HandlerFunc {
    return func(ctx *faygo.Context) error {
        return ctx.String(200, "faygo")
    }
}

// Page2 handler contains API doc description
var Page2 = faygo.WrapDoc(Page(), "test page2 notes", "test")
// Param binds and validates the request parameters by Tags
type Param struct {
    Id    int    `param:"<in:path> <required> <desc:ID> <range: 0:10>"`
    Title string `param:"<in:query>"`
}

// Serve implemente Handler interface
func (p *Param) Serve(ctx *faygo.Context) error {
    return ctx.JSON(200,
        faygo.Map{
            "Struct Params":    p,
            "Additional Param": ctx.PathParam("additional"),
        }, true)
}

// Doc implemente API Doc interface (optional)
func (p *Param) Doc() faygo.Doc {
    return faygo.Doc{
        // Add the API notes to the API doc
        Note: "param desc",
        // declare the response content format to the API doc
        Return: faygo.JSONMsg{
            Code: 1,
            Info: "success",
        },
        // additional request parameter declarations to the API doc (optional)
        Params: []faygo.ParamInfo{
            {
                Name:  "additional",
                In:    "path",
                Model: "a",
                Desc:  "defined by the `Doc()` method",
            },
        },
    }
}

Filter function

The filter function must be HandleFunc type!

func Root2Index(ctx *faygo.Context) error {
    // Direct access to `/index` is not allowed
    if ctx.Path() == "/index" {
        ctx.Stop()
        return nil
    }
    if ctx.Path() == "/" {
        ctx.ModifyPath("/index")
    }
    return nil
}

Route registration

// New application object, params: name, version
var app1 = faygo.New("myapp1", "1.0")

// router
app1.Filter(Root2Index).
    Route(
        app1.NewNamedGET("test page", "/page", Page()),
        app1.NewNamedGET("test page2", "/page2", Page2),
        app1.NewGroup("home",
            app1.NewNamedGET("test param", "/param", &Param{
                // sets the default value in the API documentation for the request parameters (optional)
                Id:    1,
                Title: "test param",
            }),
        ),
    )
// New application object, params: name, version
var app2 = faygo.New("myapp2", "1.0")

// router
app2.Filter(Root2Index)
app2.NamedGET("test page", "/page", Page())
app2.NamedGET("test page2", "/page2", Page2)
app2.Group("home")
{
    app2.NamedGET("test param", "/param", &Param{
        // sets the default value in the API documentation for the request parameters(optional)
        Id:    1,
        Title: "test param",
    })
}

Shutdown and reboot

kill [pid]
kill -USR2 [pid]

Configuration

net_types              = http|https              # List of network type: http | https | unix_http | unix_https | letsencrypt | unix_letsencrypt
addrs                  = 0.0.0.0:80|0.0.0.0:443  # List of multiple listening addresses
tls_certfile           =                         # TLS certificate file path
tls_keyfile            =                         # TLS key file path
letsencrypt_dir        =                         # Let's Encrypt TLS certificate cache directory
unix_filemode          = 0666                    # File permissions for UNIX listener, requires octal number
http_redirect_https    = false                   # Redirect from 'http://hostname:port1' to 'https://hostname:port2'
read_timeout           = 0s                      # Maximum duration for reading the full; ns|µs|ms|s|m|h request (including body)
write_timeout          = 0s                      # Maximum duration for writing the full; ns|µs|ms|s|m|h response (including body)
multipart_maxmemory_mb = 32                      # Maximum size of memory that can be used when receiving uploaded files
slow_response_threshold= 0s                      # When response time > slow_response_threshold, log level   = 'WARNING'; 0 means not limited; ns|µs|ms|s|m|h
print_body             = false                   # Form requests are printed in JSON format, but other types are printed as-is

[router]                                         # Routing config section
redirect_trailing_slash   = true                 # Automatic redirection (for example, `/foo/` -> `/foo`)
redirect_fixed_path       = true                 # Tries to fix the current request path, if no handle is registered for it
handle_method_not_allowed = true                 # Returns 405 if the requested method does not exist, otherwise returns 404
handle_options            = true                 # Automatic response OPTIONS request, you can set the default Handler in Faygo
no_default_params         = false                # If true, don't assign default request parameter values based on initial parameter values of the routing handler
default_upload            = true                 # Automatically register the default router: /upload/*filepath
default_static            = true                 # Automatically register the default router: /static/*filepath

[xsrf]                                           # XSRF security section
enable        = false                            # Whether enabled or not
key           = faygoxsrf                        # Encryption key
expire_second = 3600                             # Expire of XSRF token

[session]                                        # Session section
enable                 = false                   # Whether enabled or not
provider               = memory                  # Data storage
name                   = faygosessionID          # The client stores the name of the cookie
provider_config        =                         # According to the different engine settings different config information
cookie_life_second     = 0                       # The default value is 0, which is the lifetime of the browser
gc_life_second         = 300                     # The interval between triggering the GC
max_life_second        = 3600                    # The session max lefetime
auto_setcookie         = true                    # Automatically set on the session cookie value, the general default true
domain                 =                         # The domain name that is allowed to access this cookie
enable_sid_in_header   = false                   # Whether to write a session ID to the header
name_in_header         = Faygosessionid          # The name of the header when the session ID is written to the header
enable_sid_in_urlquery = false                   # Whether to write the session ID to the URL Query params

[apidoc]                                         # API documentation section
enable      = true                               # Whether enabled or not
path        = /apidoc                            # The URL path
nolimit     = false                              # If true, access is not restricted
real_ip     = false                              # If true, means verifying the real IP of the visitor
whitelist   = 192.*|202.122.246.170              # `whitelist=192.*|202.122.246.170` means: only IP addresses that are prefixed with `192.` or equal to `202.122.246.170` are allowed
desc        =                                    # Description of the application
email       =                                    # Technician's Email
terms_url   =                                    # Terms of service
license     =                                    # The license used by the API
license_url =                                    # The URL of the protocol content page
[cache]                                          # Cache section
enable         = false                           # Whether enabled or not
size_mb        = 32                              # Max size by MB for file cache, the cache size will be set to 512KB at minimum.
expire_second  = 60                              # Maximum duration for caching

[gzip]                                           # compression section
enable         = false                           # Whether enabled or not
min_length     = 20                              # The minimum length of content to be compressed
compress_level = 1                               # Non-file response Body's compression level is 0-9, but the files' always 9
methods        = GET                             # List of HTTP methods to compress. If not set, only GET requests are compressed.

[log]                                            # Log section
console_enable = true                            # Whether enabled or not console logger
console_level  = debug                           # Console logger level: critical | error | warning | notice | info | debug
file_enable    = true                            # Whether enabled or not file logger
file_level     = debug                           # File logger level: critical | error | warning | notice | info | debug
async_len      = 0                               # The length of asynchronous buffer, 0 means synchronization

Handler struct tags

tagkeyrequiredvaluedesc
paraminonly onepath(position of param) if required is unsetted, auto set it. e.g. url: "http://www.abc.com/a/{path}"
paraminonly onequery(position of param) e.g. url: "http://www.abc.com/a?b={query}"
paraminonly oneformData(position of param) e.g. "request body: a=123&b={formData}"
paraminonly onebody(position of param) request body can be any content
paraminonly oneheader(position of param) request header info
paraminonly onecookie(position of param) request cookie info, support: *http.Cookie,http.Cookie,string,[]byte
paramnameno(e.g.id)specify request param`s name
paramrequirednorequest param is required
paramdescno(e.g.id)request param description
paramlenno(e.g.3:6)length range [a,b] of param's value
paramrangeno(e.g.0:10)numerical range [a,b] of param's value
paramnonzeronoparam`s value can not be zero
parammaxmbno(e.g.32)when request Content-Type is multipart/form-data, the max memory for body.(multi-param, whichever is greater)
paramregexpno(e.g.^\\w+$)verify the value of the param with a regular expression(param value can not be null)
paramerrno(e.g.incorrect password format)the custom error for binding or validating

NOTES:

Handler struct fields type

baseslicespecial
string[]string[][]byte
byte[]byte[][]uint8
uint8[]uint8*multipart.FileHeader (only for formData param)
bool[]bool[]*multipart.FileHeader (only for formData param)
int[]int*http.Cookie (only for net/http's cookie param)
int8[]int8http.Cookie (only for net/http's cookie param)
int16[]int16struct (struct type only for body param or as an anonymous field to extend params)
int32[]int32
int64[]int64
uint8[]uint8
uint16[]uint16
uint32[]uint32
uint64[]uint64
float32[]float32
float64[]float64

Expansion package

package summaryimport path
barcodegithub.com/andeya/faygo/ext/barcode
Bit unit conversiongithub.com/andeya/faygo/ext/bitconv
gorm(DB ORM)github.com/andeya/faygo/ext/db/gorm
sqlx(DB ext)github.com/andeya/faygo/ext/db/sqlx
xorm(DB ORM)github.com/andeya/faygo/ext/db/xorm
directSQL(Configured SQL engine)github.com/andeya/faygo/ext/db/directsql
One-time Passwordgithub.com/andeya/faygo/ext/otp
UUIDgithub.com/andeya/faygo/ext/uuid
Websocketgithub.com/andeya/faygo/ext/websocket
inigithub.com/andeya/faygo/ini
crongithub.com/andeya/faygo/ext/cron
taskgithub.com/andeya/faygo/ext/task
http clientgithub.com/andeya/faygo/ext/surfer

Know Cases

Product NameWeb/App ServerHome Page
盯房Apphttps://www.df-house.com
eTradeApphttps://fir.im/ejy
OneForApphttps://fir.im/eqb
杰运好车Apphttps://itunes.apple.com/cn/app/%E6%9D%B0%E8%BF%90%E5%A5%BD%E8%BD%A6/id1301132479?mt=8

Note: Sorted in alphabetical order

Business Users

<a href="https://tech.pingan.com/index.html" style="margin-right: -120px"><img src="http://pa-tech.hirede.com/templates/pa-tech/Images/logo.png" height="50" width="406" alt="平安科技"/></a>    <a href="https://www.followme.cn/"><img src="https://raw.githubusercontent.com/andeya/imgs-repo/master/followme.png" height="60" alt="Followme"/></a> <br/> <a href="https://www.df-house.com/"><img src="https://www.df-house.com/dfhouse/img/logo.png" height="50" alt="杭州盯房科技有限公司"/></a>    <a href="http://www.zlgjjt.com/" style="background-color:block"><img src="http://company.zhaopin.com/CompanyLogo/20160314/524FDDEA17D14FAEB704AD40E5179988.jpg" height="70" alt="众联网游"/></a>    <a href="https://www.phonelee.com/"><img src="http://company.zhaopin.com/CompanyLogo/20170522/1DE0ABD220F1C4A253751F78B35E32F4.jpg" height="70" alt="丰利金服"/></a>

License

Faygo is under Apache v2 License. See the LICENSE file for the full license text