A boa estrutura
Captura de tela das métricas do suporte de teste de longo prazo do Gramework feita com o Gramework Stats Dashboard e o middleware de métricas
Gramework é uma estrutura da web rápida, altamente eficaz, confiável, com foco em SPA, feita por um mantenedor fasthttp. Você obtém uma API simples, mas poderosa, e nós cuidamos das otimizações internamente. Ficamos sempre felizes em ver suas solicitações de recursos e PRs.
Razões para usar Grammework
Go >= 1.10.8 é a versão mais antiga continuamente testada e suportada.
Se você encontrar alguma vulnerabilidade, sinta-se à vontade para enviá-la via [email protected].
Nome | Link/Selo |
---|---|
Documentos | GoDoc |
Nossa Jira | Jira |
Relatório de licença | Relatório |
Registro de alterações | Registro de alterações |
Apoie-nos com uma doação ou torne-se um patrocinador | OpenCollective |
Nosso bate-papo no Telegram | @gramework |
Nosso canal #gramework no Gophers Slack | https://gophers.slack.com |
Nosso servidor Discord | https://discord.gg/HkW8DsD |
Cobertura de filial principal | |
Status da filial principal | |
Cobertura da filial de desenvolvimento | |
Status do branch de desenvolvimento | |
Melhores Práticas CII | |
Painel de estatísticas do Gramework para Grafana | https://grafana.com/dashboards/3422 |
Contatos de suporte | Por e-mail: [email protected] |
Via comunidade Telegram: @gramework |
Este projeto existe graças aos nossos incríveis colaboradores! [Contribuir].
Obrigado a todos os nossos apoiadores! [Torne-se um apoiador]
Apoie este projeto tornando-se um patrocinador. Seu logotipo aparecerá aqui com um link para seu site. [Torne-se um patrocinador]
/third_party_licenses/fasthttp
e /third_party_licenses/fasthttprouter
.nettls_*.go
, é uma versão integrada do caddytls, pois usá-lo através de uma simples importação não é uma opção, o gramework é baseado em fasthttp
, que é incompatível com net/http
. No commit em que me baseei, caddy é licenciado Apache-2.0
. Sua licença está em /third_party_licenses/caddy
. @mholt nos permite copiar o código neste repositório. O exemplo abaixo servirá "olá, grameworld". O Gramework registrará o sinalizador bind
para você, que permite que você escolha outro ip/porta onde o gramework deverá escutar:
package main
import (
"github.com/gramework/gramework"
)
func main () {
app := gramework . New ()
app . GET ( "/" , "hello, grameworld" )
app . ListenAndServe ()
}
Se você não quiser oferecer suporte ao sinalizador bind
, passe o argumento de endereço opcional para ListenAndServe
.
NOTA : todos os exemplos abaixo registrarão o sinalizador bind
.
Da versão: 1.1.0-rc1
O exemplo abaixo servirá {"hello":"grameworld"}
do mapa. O Gramework registrará o sinalizador bind
para você, que permite que você escolha outro ip/porta onde o gramework deverá escutar:
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 ()
}
Da versão: 1.1.0-rc1
O exemplo abaixo servirá {"hello":"grameworld"}
da estrutura. O Gramework registrará o sinalizador bind
para você, que permite que você escolha outro ip/porta onde o gramework deverá escutar:
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 ()
}
O exemplo abaixo servirá arquivos estáticos de ./files
:
package main
import (
"github.com/gramework/gramework"
)
func main () {
app := gramework . New ()
app . GET ( "/*any" , app . ServeDir ( "./files" ))
app . ListenAndServe ()
}
O exemplo abaixo servirá uma fatia de bytes:
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
}
Este exemplo demonstra como migrar do fasthttp para o gramework sem reescrever seus manipuladores.
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 ()
}