Pular para o conteúdo principal

victorstein.dev

14/100 Dias de Golang - Requests para APIs Externas - Parte 1

Table of Contents

# Requests para APIs Externas - Parte 1

Vou tentar fazer alguma coisa mais prática, nesses últimos dias, foquei no estudo da base da linguagem, entender sintaxe, como as coisas funcionam, mas agora quero fazer algo mais prático. Vamos fazer uma aplicação que consome uma API externa, para isso, vamos usar a API do Senhor dos Anéis, que é uma API gratuita e fácil de usar. Para usar alguns endpoints, precisamos de uma chave de API, mas alguns endpoints não precisam. Para conseguir a chave, basta se cadastrar no site e gerar uma chave.

# Configurando um Request HTTP Básico

O Go, fornece uma biblioteca padrão net/http para realizar requisições HTTP. Vamos começar com um exemplo básico de como realizar uma requisição GET para a rota /book da API do Senhor dos Anéis. Essa rota não precisa de autenticação, então podemos fazer a requisição sem a chave de API.

package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	url := "https://the-one-api.dev/v2/book"
	resp, err := http.Get(url)
	if err != nil {
		fmt.Println("Erro ao fazer request:", err)
		return
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Erro ao ler resposta:", err)
		return
	}

	fmt.Println("Resposta:", string(body))
}

Nas primeiras linhas, importamos os pacotes necessários. O pacote net/http é usado para fazer requisições HTTP e o pacote io é usado para ler a resposta da requisição.

import (
	"fmt"
	"io"
	"net/http"
)

Nessa linha realizamos a requisição GET para a URL da API. O método http.Get retorna um ponteiro para a resposta (resp) e um erro (err).

resp, err := http.Get(url)

Essa estrutura if err != nil verifica se houve algum erro na requisição. Se houver, imprimimos o erro e retornamos, nesse caso, enceramos a execução do programa. Essa validação do if err != nil é muito utilizada em Go, sempre que fazemos uma operação que pode falhar, devemos verificar se houve erro. Isso é uma das características da linguagem Go, que preza pela simplicidade e clareza no tratamento de erros. Muitos não gostam dessa forma de tratar erros, mas é uma característica da linguagem, particularmente eu goste, acho mais elegante que o try/except de outras linguagens.

if err != nil {
    fmt.Println("Erro ao fazer request:", err)
    return
}

O defer é uma palavra-chave do Go que permite adiar a execução de uma função até que a função que contém o defer retorne. Nesse caso, estamos usando o defer para fechar o corpo da resposta (resp.Body) assim que a função main retornar. Isso é importante para liberar os recursos utilizados pela resposta HTTP. Quando estamos trabalhando com arquivos, sempre usamos o defer para fechar o arquivo após a leitura ou escrita.

defer resp.Body.Close()

A função io.ReadAll lê todos os dados do corpo da resposta e retorna um slice de bytes. Esse slice de bytes é convertido para string e impresso na tela.

body, err := io.ReadAll(resp.Body)
if err != nil {
    fmt.Println("Erro ao ler resposta:", err)
    return
}
fmt.Println("Resposta:", string(body))