Web server
O pacote colibri-sdk-go fornece uma abstração de um servidor web. "Por baixo do capô", utilizamos o Fiber, mas ele pode ser facilmente substituído através da implementação de um novo container no pacote pkg/web/restserver.
Isso cria uma camada de serviço independente. Como exemplo, o colibri-sdk-go utilizava originalmente uma implementação baseada no gorilla/mux, que foi substituída em versões posteriores mantendo a compatibilidade total com os projetos existentes.
Para utilizar o servidor, devemos configurar a variável de ambiente PORT (o padrão é 8080).
Após as configurações, adicionamos a instrução restserver.ListenAndServe() como a última linha da função main.
func main() {
colibri.InitializeApp()
// my main code
restserver.ListenAndServe()
}
Rotas
Para registrar rotas, utilizamos a função restserver.AddRoutes, passando um slice de []restserver.Route. Essa instrução pode ser executada múltiplas vezes, conforme o exemplo abaixo:
var awesomeRoutes = []restserver.Route{
{
...
},
}
var moreAwesomeRoutes = []restserver.Route{
{
...
},
}
func main() {
colibri.InitializeApp()
// my main code
restserver.AddRoutes(awesomeRoutes)
restserver.AddRoutes(moreAwesomeRoutes)
restserver.ListenAndServe()
}
Atributos da Route
A struct Route aceita os seguintes atributos:
- URI (Obrigatório) Especifica o caminho ou o endpoint para a rota HTTP.
- Method (Obrigatório) Especifica o método HTTP (como GET, POST) associado à rota.
- Prefix (Obrigatório) Define um prefixo comum para as rotas. Aceita os valores:
PublicApi:/public/PrivateApi:/private/AuthenticatedApi:/api/NoPrefix:/
- Function (Obrigatório) Especifica qual função handler executar quando a rota é acessada.
- BeforeEnter (Não obrigatório) É uma função executada antes de entrar na função handler da rota.
BeforeEnter
Para definir uma função middleware que será executada antes de chamar a função handler da rota, basta passar uma função na definição da rota, conforme o exemplo abaixo:
func beforeEnterExample(ctx WebContext) *MiddlewareError {
// validation code, return "*MiddlewareError" for errors
return nil // success
}
var awesomeRoutes = []restserver.Route{
{
URI: "user",
Method: http.MethodGet,
Function: func(ctx WebContext) {
ctx.JsonResponse(http.StatusOK, &Resp{Msg: "user get"})
},
Prefix: AuthenticatedApi,
BeforeEnter: beforeEnterExample,
},
}
Middlewares globais
Para adicionar middlewares globais, criamos uma implementação da interface abaixo e registramos a mesma na função main com o comando restserver.Use(&MyCustomMiddleware{}), onde MyCustomMiddleware implementa a internface CustomMiddleware.
type CustomMiddleware interface {
Apply(ctx WebContext) *MiddlewareError
}
Rotas autenticadas
Por padrão, todas as rotas com o prefixo AuthenticatedApi utilizam o middleware de autenticação que valida se existe um token JWT no header Authorization da request.
Middleware de autenticação customizado
Para substituir o middleware padrão, pode-se criar uma implementação para a interface CustomAuthenticationMiddleware e registrar a mesma na função main com a instrução restserver.CustomAuthMiddleware(&middlewares.MyCustomAutheMiddleware{})
type CustomAuthenticationMiddleware interface {
Apply(ctx WebContext) (*security.AuthenticationContext, error)
}