Aula 02 - Golang para Web - Gorilla mux
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Meus links de afiliados:
Código da aula: Github
Adicionando endpoints com gorilla MUX
Um
endpoint de um
web service é a
URL onde o serviço pode ser acessado.
Para adicionar mais
endpoints vamos utilizar o pacote
gorilla MUX.
O
mux implementa um roteador e um despachante de solicitação.
O nome
mux significa "
multiplexador de solicitação HTTP".
Como o
http.ServeMux padrão, o
mux.Router combina solicitações recebidas em uma lista de rotas registradas e chama um manipulador para a rota que corresponde à URL ou a outras condições.
OBSERVAÇÕES POSTERIORES AO POST ORIGINAL
Antes de seguir
OBS 01. Quem tiver problema com a instalação e imports do Gorilla mux, provavelmente é porque o
GO111MODULE=on tá ativado, pra desativar passe para
off, pra fazer isso é só rodar:
go env -w GO111MODULE=off
OBS 02. Quem tiver problema no
vscode de na hora de
salvar uma
mudança e as
mudanças sumirem, ou por exemplo,
alterar a linha sozinha, onde você inseriu determinado
import, como se fosse um
fenômeno paranormal, faça o seguinte:
1- Digite
Ctrl +
Shift +
p
2 - escolha
Preferences:
Configure Language Specific Settings e procure por
Go na lista e clique nele, vai abrir o
settings.json
3 - Configure o
editor.formatOnSave para
false:
"editor.formatOnSave": false e salve.
Agora podemos instalar o gorilla MUX
Vamos inicializar o diretório atual como a raiz do módulo.
go mod init nome_do_modulo
No meu caso, como eu chamei o app de
web_app, então eu executaria o comando assim:
go mod init web_app
Esse comando vai criar o arquivo
go.mod que vai inicializar o diretório atual como a
raiz do
módulo e nos permitirá gerenciar dependências.
Agora você pode rodar o comando abaixo
go mod tidy.
go mod tidy
O comando
go mod tidy, fará o download de todas as dependências necessárias em seus arquivos de origem e atualizará o arquivo
go.mod com essas dependência.
No caso até agora, só o
gorilla/mux.
Examine o conteúdo do arquivo
go.mod.
Veja que ele tem algo do tipo:
web_app/go.mod
module web_app
go 1.18
require (
github.com/go-redis/redis v6.15.9+incompatible
github.com/gorilla/mux v1.8.0
)
require (
github.com/onsi/ginkgo v1.16.5 // indirect
github.com/onsi/gomega v1.19.0 // indirect
)
Partiu código! ;)
O que vamos fazer:
- Vamos subir a função main() para o topo, logo depois dos imports;
- Inserir o import do gorilla MUX;
- Criar uma instância do roteador do gorilla;
- Usar o HandleFunc() do router do gorilla ao invés do http, para GET, em 3 rotas:
- /contact
- /about
- /
- Dizer ao http que queremos usar o roteador do gorilla MUX como padrão.
- Definir as funções manipuladoras de solicitações GET para as rotas:
- index
- contact
- about
package main
import(
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
)
func main(){
r := mux.NewRouter()
r.HandleFunc("/contact", contactHandler).Methods("GET")
r.HandleFunc("/about", aboutHandler).Methods("GET")
r.HandleFunc("/", indexHandler).Methods("GET")
http.Handle("/", r)
log.Fatal(http.ListenAndServe(":8000", nil))
}
//request index page handle
func indexHandler(w http.ResponseWriter, r *http.Request){
fmt.Fprint(w, "This is the index page!")
}
//request contact page handle
func contactHandler(w http.ResponseWriter, r *http.Request){
fmt.Fprint(w, "This is the contact page!")
}
//request about page handle
func aboutHandler(w http.ResponseWriter, r *http.Request){
fmt.Fprint(w, "This is the about page!")
}
Nas funções que lidam com as
solicitações, isto é, as
requests, nossas funções:
indexHandler, contactHandler e
aboutHandler, recebem um
w http.ResponseWriter, que é uma interface
ResponseWriter, usada pelo
Handle HTTP para construir uma resposta
HTTP.
Recebe também um
http.Request, que é uma solicitação que representa uma
request HTTP recebida por um servidor ou a ser enviada por um cliente.
O
w http.ResponseWriter é uma
interface e os tipos existentes que implementam essa
interface são
ponteiros.
Isso significa que não há necessidade de usar um
ponteiro para esta
interface.
O
r *http.Request não precisa ser necessariamente um ponteiro, mas, não é prático usar ele sem sê-lo, pelo menos não em um servidor
http go.
Por isso o
asterisco, porque estamos usando ele como é recomendado, como ponteiro.
O
http.Request não é uma interface, é apenas uma estrutura, como queremos alterar a estrutura e fazer com que o servidor da Web veja essas alterações, ele deve ser usado como um ponteiro.
Se fosse apenas um valor
struct, modificaríamos apenas uma cópia dele.
Para maiores informações sobre
interfaces go acesse:
https://www.airs.com/blog/archives/281
Agora vamos rodar nossa aplicação:
go run main.go
E acessar:
Ficamos por aqui!
Código da aula: Github
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Novamente deixo meus link de afiliados:
Obrigado, até a próxima e bons estudos. ;)