Skip to main content

Web server

O projeto colibri-sdk-go fornece uma abstração de um container web, por baixo do capô utilizamos o fiber, mas ele pode ser facilmente trocado implementando um novo container, na pasta pkg/web/restserver.

Com isso criamos uma camada independente de serviço, como exemplo, o próprio colibri-sdk-go nasceu em cima de uma implementação do gorilla/mux, sendo trocado sua base durante suas versões anteriores mantendo a compatibilidade dos projetos que utilizavam colibri-sdk-go.

Para utilizar o projeto, devemos primeiramente configurar a variável de ambiente PORT, por padrão é utilizada a porta 8080.

Após isso precisamos adicionar o código restserver.ListenAndServe() como última instrução da função main.


func main() {
colibri.InitializeApp()

// my main code

restserver.ListenAndServe()
}

Rotas

Para se registrar rotas, utilizamos a instrução restserver.AddRoutes passando como parâmetro um slice []restserver.Route, essa instrução pode ser executada mais de uma vez como no 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()
}

Route attributes

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 como do exemplo abaixo na definição da rota.

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)
}