Faygo — это быстрый и лаконичный веб-фреймворк Go, который позволяет создавать высокопроизводительные веб-приложения с использованием минимального количества кода, особенно в случае API-интерфейсов.
Достаточно определить struct Handler, чтобы Faygo автоматически привязывал и проверял параметры запроса, а также генерировал онлайн-документацию по API.
Версия: v1.2.0
Требования к установке: версия Go должна быть не ниже 1.8.
Быстрое использование:
go get -u -v github.com/andeya/faygo
go get -u -v github.com/andeya/fay
fay command [arguments]
The commands are:
new 创建、编译和运行(监控文件变化)一个新的faygo项目
run 编译和运行(监控文件变ция)任意一个已存在的golang项目
fay new appname [apptpl]
appname 指定新faygo项目的创建目录
apptpl 指定一个faygo项目模板(可选)
fay run [appname]
appname 指定待运行的golang项目路径(可选)
Особенности фреймворка:
Простой пример:
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
``` **Сервис**
```faygo.Run()```
**HTTP GET:**
* *URL:*
*http://localhost:8080/index/1?title=test&p=abc&p=xyz*
*Ответ:*
{
"Id": 1,
"Title": "test",
"Paragraph": [
"abc",
"xyz"
],
"Cookie": "2016-11-13 01:14:40.9038005 +0800 CST"
}
## Операции и промежуточное ПО
Операции и промежуточное ПО одинаковы, все они реализуют интерфейс Handler!
- Тип функции
```go
// Не содержит API-документации
func Page() faygo.HandlerFunc {
return func(ctx *faygo.Context) error {
return ctx.String(200, "faygo")
}
}
// Содержит API-документацию
var Page2 = faygo.WrapDoc(Page(), "Описание страницы 2", "Текст")
// Param операция связывает и проверяет параметры запроса с помощью тега
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-документе (JSON)
Return: faygo.JSONMsg{
Code: 1,
Info: "success",
},
// Добавить дополнительные параметры запроса в API-документ (необязательно)
Params: []faygo.ParamInfo{
{
Name: "additional",
In: "path",
Model: "a",
Desc: "Определено методом `Doc()`",
},
},
}
}
Функция фильтрации должна быть типа 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("Тестовый параметр", "/param", &Param{
// Установить значения по умолчанию для связанных параметров в API-документах (необязательно)
Id: 1,
Title: "Тестовый параметр",
}),
),
)
// Создать новое приложение, параметры: имя, версия
var app2 = faygo.New("myapp2", "1.0")
// Маршрут
app2.Filter(Root2Index)
app2.NamedGET("тестовая страница", "/page", Page())
app2.NamedGET("тестовая страница 2", "/page2", Page2)
app2.Group("home") {
app2.NamedGET("параметр тестирования", "/param", &Param{
// Установить значения по умолчанию для связанных параметров в API-документах (необязательно)
Id: 1,
Title: "параметр тестирования",
})
}
kill [pid]
kill -USR2 [pid]
config/{appname}[_{version}].ini
, подробности конфигурации:net_types = http|https # Список различных типов сетей, поддерживаемых http | https | unix_http | unix_https | letsencrypt | unix_letsencrypt
addrs = 0.0.0.0:80|0.0.0.0:443 # Несколько адресов прослушивания
tls_certfile = # Путь к файлу сертификата TLS
tls_keyfile = # Путь к файлу ключа TLS
letsencrypt_dir = # Каталог кэша сертификатов Let's Encrypt TLS
unix_filemode = 0666 # Права доступа к файлам UNIX listener, требуется использовать восьмеричное число
http_redirect_https = false # Перенаправление с 'http://hostname:port1' на 'https://hostname:port2'
read_timeout = 0s # Тайм-аут чтения данных запроса; ns|µs|ms|s|m|h
write_timeout = 0s # Время ожидания записи данных ответа; ns|µs|ms|s|m|h
multipart_maxmemory_mb = 32 # Максимальный объём памяти, разрешённый при загрузке файлов
slow_response_threshold= 0s # Когда время отклика > slow_response_threshold, уровень журнала устанавливается на «WARNING»; 0 означает без ограничений; ns|µs|ms|s|m|h
print_body = false # Вывести тело запроса формы в формате JSON, вывести тело других типов запросов в исходном виде
[router] # Область конфигурации маршрутизатора
redirect_trailing_slash = true # Если текущий запрос URL содержит суффикс `/`, а соответствующий маршрут не существует, например, `/foo/` и существует `/foo`, то автоматически перенаправляется на `/foo`
redirect_fixed_path = true # Автоматическое исправление URL, например, `/FOO` `/..//Foo` все перенаправляются на `/foo` (зависит от redirect_trailing_slash=true) ```
handle_method_not_allowed = true # Если включено, то при отсутствии текущего запроса возвращается 405, иначе возвращается 404
handle_options = true # Если включено, автоматически отвечает на запросы класса OPTIONS, в Faygo можно установить обработчик по умолчанию
no_default_params = false # Если включено, не использует значения параметров обработчика как значения по умолчанию для запроса
default_upload = true # Автоматически регистрирует статический маршрут по умолчанию: /upload/*filepath
default_static = true # Автоматически регистрирует статический маршрут по умолчанию: /static/*filepath
[xsrf] # Область конфигурации фильтрации подмены межсайтовых запросов (XSRF)
enable = false # Включено ли
key = faygoxsrf # Ключ шифрования
expire_second = 3600 # Срок действия токена защиты от подделки XSRF
[session] # Область конфигурации сеанса (подробности см. в модуле сеанса beego)
enable = false # Включено ли
provider = memory # Способ хранения данных
name = faygosessionID # Имя cookie, которое клиент хранит в браузере
provider_config = # Конфигурационная информация, которая зависит от разных движков и имеет разные настройки
cookie_life_second = 0 # Время жизни cookie клиента, значение по умолчанию равно 0, что означает срок жизни, равный сроку жизни браузера
gc_life_second = 300 # Время запуска сборщика мусора
max_life_second = 3600 # Максимальный срок жизни сессии
auto_setcookie = true # Автоматически ли устанавливать значение cookie, связанное с сеансом, обычно по умолчанию используется значение true
domain = # Домен, к которому можно получить доступ к этому cookie
enable_sid_in_header = false # Следует ли включать идентификатор сеанса в заголовок
name_in_header = Faygosessionid # Идентификатор сеанса записывается в заголовок, когда он включён
enable_sid_in_urlquery = false # Следует ли включать идентификатор сессии в строку запроса URL
[apidoc] # API-документ
enable = true # Включено ли
path = /apidoc # Путь доступа
nolimit = false # Не ограничивать доступ IP
real_ip = false # Использовать реальный IP клиента для фильтрации
whitelist = 192.*|202.122.246.170 # Означает разрешение доступа с префиксом 192 или равным 202.122.246.170 IP
desc = # Описание проекта
email = # Электронная почта контактного лица
terms_url = # URL условий обслуживания
license = # Тип лицензии
license_url = # Содержание лицензии
config/__global__.ini
, конфигурация выглядит следующим образом:[cache] # Область конфигурации файлового кэша
enable = false # Включено ли
size_mb = 32 # Разрешённый максимальный объём памяти для кэширования (в МБ), если значение равно 0, система автоматически устанавливает значение 512 КБ
expire_second = 60 # Максимальное время кэширования
[gzip] # Область конфигурации сжатия gzip
enable = false # Включено ли
min_length = 20 # Минимальная длина содержимого, подлежащего сжатию
compress_level = 1 # Уровень сжатия нефайловых ответов Body (0–9), обратите внимание, что сжатие файлов всегда выполняется с оптимальным коэффициентом сжатия (9)
methods = GET # Методы запроса, которые разрешено сжимать, если пусто, по умолчанию используются методы GET
[log] # Область конфигурации журнала
console_enable = true # Включить ли консоль журнала
console_level = debug # Уровень журнала консоли: критический | ошибка | предупреждение | уведомление | информация | отладка
file_enable = true # Включить ли файл журнала
file_level = debug # Уровень файла журнала: критический | ошибка | предупреждение | уведомление | информация | отладка
async_len = 0 # Значение 0 означает синхронную печать, а значение больше 0 означает асинхронное кэширование длины
tag | key | required | value | desc |
---|---|---|---|---|
param | in | Есть и только один | path | (позиция параметра) заполняется автоматически, например, URL http://www.abc.com/a/{path} |
param | in | Есть и только один | query | (позиция параметра), например, URL http://www.abc.com/a?b={query} |
param | in | Есть и только один | formData | (позиция параметра), запрос формы, например a=123&b={formData} |
param | in | Есть и только один | body | (позиция параметра), тело запроса |
param | in | Есть и только один | header | (позиция параметра), заголовок запроса |
param | in | Есть и только один | cookie | (позиция параметра), cookie запроса, поддерживает: *http.Cookie, http.Cookie, string, []byte и т. д. |
param | name | Нет | (например, id) | Имя пользовательского параметра |
param | required |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )