5.1 Introdução ao HttpClient
No Python, assim como em muitas linguagens de programação, existe um
HttpClient padrão. No Python ele se chama http.client
e permite
fazer requisições HTTP de baixo nível e trabalhar com respostas HTTP. Ele
permite criar conexões com servidores HTTP e interagir
com eles.
Módulos de baixo nível, como http.client
, oferecem um controle mais detalhado sobre operações HTTP,
mas requerem mais código para realizar tarefas. Diferente disso, módulos de alto nível, como requests
,
oferecem uma interface mais simples, escondendo muitos detalhes de implementação.
Principais funcionalidades do http.client
O módulo http.client
oferece as seguintes funcionalidades
principais:
- Criação de conexões HTTP.
- Envio de requisições HTTP.
- Leitura de respostas HTTP.
- Processamento de cabeçalhos e corpo de requisições e respostas.
Ao contrário do módulo requests
, o módulo http.client
é mais
de baixo nível e há uma maior atenção aos detalhes do funcionamento
de uma requisição HTTP.
Principais classes e métodos do http.client
Classe/Método | Descrição |
---|---|
HTTPConnection |
Criação de uma conexão HTTP. |
HTTPSConnection |
Criação de uma conexão HTTPS. |
request(method, url, ...) |
Envio de uma requisição HTTP. |
getresponse() |
Obtenção da resposta para a requisição. |
response.status |
Código de status da resposta. |
response.reason |
Descrição textual do status da resposta. |
response.read() |
Leitura dos dados da resposta. |
response.getheaders() |
Obtenção de todos os cabeçalhos da resposta. |
response.getheader(name) |
Obtenção do valor de um cabeçalho específico. |
Vamos dar uma olhada em alguns deles em mais detalhes.
5.2 Executando uma requisição GET
Para executar requisições usando a biblioteca http.client
,
é necessário seguir esta ordem de passos:
Estabelecer a conexão
Enviar a requisição
Obter a resposta
Fechar a conexão
É importante notar que fechar a conexão após o uso é necessário para liberar recursos e evitar vazamentos de memória. Isso é especialmente importante ao trabalhar com um grande número de requisições ou em aplicações de longa duração.
Exemplo de uso de HTTPConnection
para uma requisição HTTP simples:
import http.client
# Criação de uma conexão HTTP
conn = http.client.HTTPConnection("example.com")
# Envio de uma requisição GET
conn.request("GET", "/")
# Obtenção da resposta
response = conn.getresponse()
print(response.status, response.reason)
# Fechamento da conexão
conn.close()
Exemplo de uso de HTTPSConnection
:
import http.client
# Criação da conexão
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Envio de uma requisição GET
conn.request("GET", "/posts/1")
# Obtenção da resposta
response = conn.getresponse()
print(response.status, response.reason)
# Leitura e decodificação dos dados da resposta
data = response.read().decode('utf-8')
print(data)
# Obtenção de todos os cabeçalhos da resposta
headers = response.getheaders()
for header in headers:
print(f"{header[0]}: {header[1]}")
# Fechamento da conexão
conn.close()
Um pouco mais longo do que usando requests
, não
acha?
5.3 Executando uma requisição POST
Uma requisição POST
usando http.client
é feita de forma muito semelhante a
uma requisição GET
, exceto que os dados devem ser embalados em uma json string
manualmente, e também é necessário especificar manualmente o tipo de dados sendo
enviados — adicionar um cabeçalho Content-Type
.
Exemplo:
import http.client
import json
# Envio de uma requisição POST
conn.request("POST", "/posts", body=payload, headers=headers)
Para o body
é necessário passar um json object
serializado em uma string,
e para os headers
— um dicionário contendo informações sobre o tipo de dados.
Eles podem se parecer, por exemplo, assim:
# Dados para enviar
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Cabeçalhos – tipo do conteúdo enviado
headers = {
'Content-Type': 'application/json'
}
Então o código completo do POST request
ficaria assim:
import http.client
import json
# Dados para enviar
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Cabeçalhos
headers = {
'Content-Type': 'application/json'
}
# Criação da conexão
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Envio de uma requisição POST
conn.request("POST", "/posts", body=payload, headers=headers)
# Obtenção da resposta
response = conn.getresponse()
print(response.status, response.reason)
# Leitura e decodificação dos dados da resposta
data = response.read().decode('utf-8')
print(data)
# Fechamento da conexão
conn.close()
5.4 Tratamento de erros na execução de requisições
Acho que também será útil mostrar um exemplo de tratamento de erros, já que ele
difere do comportamento do requests
. No módulo http.client
a exceção
é lançada automaticamente
, se houve
problemas com a conexão ou outros erros HTTP.
Exemplo:
import http.client
try:
# Criação da conexão
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Envio de uma requisição GET
conn.request("GET", "/posts/1")
# Obtenção da resposta
response = conn.getresponse()
print(response.status, response.reason)
# Leitura e decodificação dos dados da resposta
data = response.read().decode('utf-8')
print(data)
except http.client.HTTPException as e:
print("Ocorreu um erro HTTP:", e)
except Exception as e:
print("Ocorreu um erro:", e)
finally:
# Fechamento da conexão
conn.close()
O que dizer? Usar o módulo requests seria, claro, mais simples. Mas! Muitos módulos e frameworks usam sob o capô justamente o http.client de baixo nível. Você precisa saber como trabalhar com ele, para que possa configurá-los corretamente.
GO TO FULL VERSION