45/100 Dias de Golang - Aplicação para buscar previsão do tempo - Parte 2
Table of Contents
#
Aplicação para buscar previsão do tempo - Parte 2
Vamos começar criando o projeto Golang:
go mod init cidadeTempo
E instalar as depêndências. Para CLI vamos usar o Cobra. Já vimos sobre o Cobra no dia 40
go get -u github.com/spf13/cobra@latest
E iniciar o projeto:
cobra-cli init
A estrutura do projeto deve ficar assim:
.
├── cmd
│ └── root.go
├── go.mod
├── go.sum
├── LICENSE
└── main.go
E vamos adicionar nossos comando principais, cidade
e tempo
cobra-cli add cidade
cobra-cli add tempo
Com esse comando dois arquivos serão criados dentro da pasta cmd, cidade.go
e tempo.go
. Já podemos rodar esses comando com: go run main.go cidade
!
#
Comando cidade
A ideia desse comando é encontrar o ID da cidade que você busca, então temos que receber uma string e fazer o request para a API com esse valor. Mas antes vamos alterar algumas coisas nesse arquivo.
var cidadeCmd = &cobra.Command{
Use: "cidade",
Short: "Retorna uma listagem de cidades",
Long: `Retorna dados das cidades candidatas que possuem a string passada como parâmetro
exemplo de uso: cidadetempo --cidade Curitiba
`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("cidade called")
},
}
Os campos Short
e Long
são uma descrição do comando. O cobra já cria um help para cada comando, go run main.go cidade -h
Retorna dados das cidades candidatas que possuem a string passada como parâmetro
exemplo de uso: cidadetempo --cidade Curitiba
Usage:
cidadeTempo cidade [flags]
Flags:
-h, --help help for cidade`
Agora vamos adicionar a flag cidade
e exibir o valor na saída do comando. Primeiro tempos que criar uma variável
var cidade string
E no init adicionar essa variável como uma flag
func init() {
rootCmd.AddCommand(cidadeCmd)
cidadeCmd.Flags().StringVarP(&cidade, "cidade", "c", "Curitiba", "Cidade que você quer o ID")
}
E vamos alterar a função do Run
para imprimir essa flag:
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("Comando cidade chamando com a flag %s", cidade)
},
Agora temos que montar o request e imprimir os dados para o usuário, para a realização dos requests vamos usar a lib padrão do golang. A função vai ficar assim:
func requestCidade(cidade string) {
url := fmt.Sprintf("https://brasilapi.com.br/api/cptec/v1/cidade/%s", cidade)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
log.Fatalf("Erro ao criar request: %v", err)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Fatalf("Erro ao fazer request: %v", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Erro ao ler resposta: %v", err)
}
fmt.Println("Status Code:", resp.StatusCode)
fmt.Println("Body:", string(body))
}
Agora basta chamar o a função do request no Init:
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("Comando cidade chamando com a flag %s", cidade)
requestCidade(cidade)
}
Já temos nosso primeira chamada real agora: go run main.go cidade --cidade Curitiba
Comando cidade chamando com a flag CuritibaStatus Code: 200
Body: [{"nome":"Curitiba","id":227,"estado":"PR"},{"nome":"Curitibanos","id":1728,"estado":"SC"}]
O código completo do arquivo cidade.go
:
package cmd
import (
"fmt"
"io"
"log"
"net/http"
"github.com/spf13/cobra"
)
var cidade string
// cidadeCmd represents the cidade command
var cidadeCmd = &cobra.Command{
Use: "cidade",
Short: "Retorna uma listagem de cidades",
Long: `Retorna dados das cidades candidatas que possuem a string passada como parâmetro
exemplo de uso: cidadetempo --cidade Curitiba
`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("Comando cidade chamando com a flag %s", cidade)
requestCidade(cidade)
},
}
func init() {
rootCmd.AddCommand(cidadeCmd)
cidadeCmd.Flags().StringVarP(&cidade, "cidade", "c", "Curitiba", "Cidade que você quer o ID")
}
func requestCidade(cidade string) {
url := fmt.Sprintf("https://brasilapi.com.br/api/cptec/v1/cidade/%s", cidade)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
log.Fatalf("Erro ao criar request: %v", err)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Fatalf("Erro ao fazer request: %v", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Erro ao ler resposta: %v", err)
}
fmt.Println("Status Code:", resp.StatusCode)
fmt.Println("Body:", string(body))
}