Go: O pacote http Parte 1

Lucas Eduardo
5 min readDec 28, 2020

--

Uma das coisas mais comuns em nosso dia a dia como desenvolvedores, é fazer requisições http, seja no front-end ou no back-end. No go, temos um pacote chamado http, que é nativo da linguagem e nos ajuda muito a realizar esse tipo de tarefa.

Essa é a primeira parte, de uma série de dois artigos, mostrando um pouco mais sobre esse pacote.

Requisitando dados

Para requisitarmos dados de outros servidores, o Go nos provê duas funções principais, Get e Post, para, respectivamente, requisições usando os métodos GET e POST. Iremos abordar mais adiante, requisições utilizando outros métodos, como PUT e DELETE.

Bom, para essa primeira demonstração eu irei utilizar o JSONPlaceholder, que é um serviço gratuito que contém algumas APIs bem bacanas para testes.

GET

Vamos começar fazendo um GET no endpoint /posts.

Bom, na primeira linha, armazenamos em uma constante a url para a qual iremos realizar a requisição. Em seguida, fazemos a chamada do método Get, passando a nossa url e armazenamos tanto a resposta, quanto o erro (se houver) em duas variáveis.

Em seguida, realizamos uma verificação para ver se ocorreu algum erro, e caso tenha ocorrido, fazemos um log.

Depois, aproveitamos para usar o defer na chamada do método Close, para garantir que esse recurso será liberado ao final da execução do nosso código.

Na penúltima linha, nós utilizamos o método ReadAll, do pacote io/ioutil para ler o corpo da resposta, armazenada na variável response. Esse método irá nos retornar um []byte, que poderemos imprimir como no console mais a frente. Finalizando, nós imprimimos na tela o valor recebido da função ReadAll, mas em formato de string.

Se executarmos o código, conseguiremos visualizar a resposta do endpoint /posts, que é um json bem grandinho hahaha.

POST

Para realizar requisições POST, iremos manter praticamente todo o código, com excessão da função utilizada, que agora vai ser a Post. O endpoint no qual será realizado a requisição, se manterá o mesmo também.

A primeira mudança, é que agora temos uma variável jsonValue, que contém o json que iremos enviar no corpo da requisição.

Agora, analisando a chamada do método Post, podemos ver que além de passar a url, também passamos o Content-Type, que nesse caso, é um application/json, pois enviaremos um json. No terceiro parâmetro, nós criamos um Buffer a partir da variável que contém o nosso json; esse buffer, é o que será enviado no corpo dessa requisição.

Se executarmos o código, conseguiremos ver um json como resposta, que é exatamente o mesmo json que enviamos no corpo da requisição. Como a API é apenas de teste, nós não gravamos nada de fato, então a única coisa que podemos ver é o corpo de resposta mesmo hahahaha.

Outros métodos

Para conseguir fazer requisições usando outros métodos, como PUT ou DELETE, nós precisamos utilizar o método NewRequest. Esse método, irá criar uma nova requisição, de acordo com o método que passarmos como parâmetro.

Como podemos ver, utilizando o método NewRequest, criamos uma nova requisição usando o método PUT. O restante ficou intacto, inclusive o json, que estamos passando como último parâmetro.

Podemos observar também, o uso da função Sprintf, que usamos para formatar a string e concatenar a nossa variável de url, com o ID de número 1, que é o post que estamos tentando "atualizar" usando o método PUT.

Se executarmos esse código, conseguiremos ver, novamente, o json que enviamos no corpo da requisição, como resposta.

Um problema

Um problema do http client default do Go, é que ele não possui um valor padrão de timeout. Vamos dar uma olhadinha em como esse client padrão é criado:

var DefaultClient = &Client{}

Basicamente, está sendo criado um client padrão, com as configurações padrões. Para o timeout, isso significa um valor padrão de 0, ou seja, sem nenhum timeout! Isso é bem ruim, pois nossas conexões podem ficar horas abertas sem nenhuma resposta.

Para simularmos esse comportamento, vamos dar uma olhadinha no exemplo a seguir:

No exemplo acima, nos usamos o pacote httptest (um pacote bem interessante do Go para testarmos conexões http.) para criarmos um servidor que receberá um handler onde usamos a função Sleep, do pacote time, para simular uma espera de mais ou menos, 1 hora. Em seguida, nós usamos a função Get passando a url desse nosso servidor de teste.

Se executarmos esse código, o client padrão do Go, ficará ali esperando a conexão ser finalizada, mesmo que dure 1 hora.

Para resolvermos isso, vamos criar um novo client e colocarmos um timeout de 10 segundos. Com isso, quando a conexão exceder o timeout que colocamos, um erro será lançado.

Quando esse código for executado e o limite for excedido, um erro será lançado e a conexão não vai ficar mais pendurada durante 1 hora.

Bom pessoal, nesse artigo quis demonstrar algumas funcionalidades da biblioteca http, principalmente as que são focadas em realizar requisições. No próximo artigo, irei abordar melhor, como podemos criar o nosso próprio servidor e receber requisições.

muito obrigado por ler ❤

--

--