Хорошая основа
Скриншот показателей стенда долгосрочного тестирования Gramework, сделанный с помощью Gramework Stats Dashboard и промежуточного программного обеспечения для показателей.
Gramework — это быстрый, высокоэффективный, надежный, ориентированный на SPA веб-фреймворк, созданный разработчиком fasthttp. Вы получаете простой, но мощный API, а мы занимаемся внутренней оптимизацией. Мы всегда рады вашим пожеланиям и отзывам о функциях.
Причины использовать Gramework
Go >= 1.10.8 — самая старая постоянно тестируемая и поддерживаемая версия.
Если вы обнаружите какие-либо уязвимости, сообщите о них по адресу [email protected].
Имя | Ссылка/значок |
---|---|
Документы | GoDoc |
Наша Джира | Джира |
Отчет о лицензии | Отчет |
Журнал изменений | Журнал изменений |
Поддержите нас пожертвованием или станьте спонсором | OpenCollective |
Наш Telegram-чат | @gramework |
Наш канал #gramework в Gophers Slack | https://gophers.slack.com |
Наш дискорд-сервер | https://discord.gg/HkW8DsD |
Покрытие главного филиала | |
Статус главной ветки | |
Охват ветки разработки | |
Статус ветки разработки | |
Лучшие практики CII | |
Панель статистики Gramework для Grafana | https://grafana.com/dashboards/3422 |
Контакты поддержки | По электронной почте: [email protected] |
Через сообщество Telegram: @gramework |
Этот проект существует благодаря нашим замечательным участникам! [Способствовать].
Спасибо всем нашим сторонникам! [Стать спонсором]
Поддержите этот проект, став спонсором. Здесь появится ваш логотип со ссылкой на ваш сайт. [Стать спонсором]
/third_party_licenses/fasthttp
и /third_party_licenses/fasthttprouter
.nettls_*.go
, представляет собой интегрированную версию caddytls, поскольку ее использование посредством простого импорта невозможно, фреймворк основан на fasthttp
, который несовместим с net/http
. В коммите, на котором я основан, caddy имеет лицензию Apache-2.0
. Его лицензия размещена в /third_party_licenses/caddy
. @mholt позволяет нам скопировать код из этого репозитория. В приведенном ниже примере будет использоваться фраза «привет, GrameWorld». Gramework зарегистрирует для вас флаг bind
, который позволит вам выбрать другой IP/порт, который gramwork должен прослушивать:
package main
import (
"github.com/gramework/gramework"
)
func main () {
app := gramework . New ()
app . GET ( "/" , "hello, grameworld" )
app . ListenAndServe ()
}
Если вы не хотите поддерживать флаг bind
, передайте необязательный аргумент адреса в ListenAndServe
.
ПРИМЕЧАНИЕ . Во всех приведенных ниже примерах будет зарегистрирован флаг bind
.
Из версии: 1.1.0-rc1
В приведенном ниже примере будет использоваться {"hello":"grameworld"}
с карты. Gramework зарегистрирует для вас флаг bind
, который позволит вам выбрать другой IP/порт, который gramwork должен прослушивать:
package main
import (
"github.com/gramework/gramework"
)
func main () {
app := gramework . New ()
app . GET ( "/" , func () map [ string ] interface {} {
return map [ string ] interface {}{
"hello" : "gramework" ,
}
})
app . ListenAndServe ()
}
Из версии: 1.1.0-rc1
В приведенном ниже примере будет использоваться {"hello":"grameworld"}
из структуры. Gramework зарегистрирует для вас флаг bind
, который позволит вам выбрать другой IP/порт, который gramwork должен прослушивать:
package main
import (
"github.com/gramework/gramework"
)
type SomeResponse struct {
hello string
}
func main () {
app := gramework . New ()
app . GET ( "/" , func () interface {} {
return SomeResponse {
hello : "gramework" ,
}
})
app . ListenAndServe ()
}
В приведенном ниже примере будут использоваться статические файлы из ./files
:
package main
import (
"github.com/gramework/gramework"
)
func main () {
app := gramework . New ()
app . GET ( "/*any" , app . ServeDir ( "./files" ))
app . ListenAndServe ()
}
В приведенном ниже примере будет использоваться байтовый срез:
package main
import (
"fmt"
"os"
"time"
"github.com/gramework/gramework"
)
type SomeData struct {
Name string
Age uint8
}
func main () {
app := gramework . New ()
d := SomeData {
Name : "Grame" ,
Age : 20 ,
}
// service-wide CORS. you can also instead of using middleware
// call ctx.CORS() manually
app . Use ( app . CORSMiddleware ())
app . GET ( "/someJSON" , func ( ctx * gramework. Context ) {
// send json, no metter if user asked for json, xml or anything else.
if err := ctx . JSON ( d ); err != nil {
// you can return err instead of manual checks and Err500() call.
// See next handler for example.
ctx . Err500 ()
}
})
app . GET ( "/simpleJSON" , func ( ctx * gramework. Context ) error {
return ctx . JSON ( d )
})
app . GET ( "/someData" , func ( ctx * gramework. Context ) error {
// send data in one of supported encodings user asked for.
// Now we support json, xml and csv. More coming soon.
sentType , err := ctx . Encode ( d )
if err != nil {
ctx . Logger . WithError ( err ). Error ( "could not process request" )
return err
}
ctx . Logger . WithField ( "sentType" , sentType ). Debug ( "some request-related message" )
return nil
})
// you can omit context if you want, return `interface{}`, `error` or both.
app . GET ( "/simplestJSON" , func () interface {} {
return d
})
// you can also use one of built-in types as a handler, we got you covered too
app . GET ( "/hostnameJSON" , fmt . Sprintf ( `{"hostname": %q}` , os . Hostname ()))
wait := make ( chan struct {})
go func () {
time . Sleep ( 10 * time . Minute )
app . Shutdown ()
wait <- struct {}{}
}()
app . ListenAndServe ()
// allow Shutdown() to stop the app properly.
// ListenAndServe will return before Shutdown(), so we should wait.
<- wait
}
В этом примере показано, как перейти с fasthttp на gramwork без переписывания обработчиков.
package main
import (
"github.com/gramework/gramework"
"github.com/valyala/fasthttp"
)
func main () {
app := gramework . New ()
app . GET ( "/someJSON" , func ( ctx * fasthttp. RequestCtx ) {
ctx . WriteString ( "another data" )
})
app . ListenAndServe ()
}