CodeGym /Cursos /Python SELF PT /Usando HttpClient

Usando HttpClient

Python SELF PT
Nível 23 , Lição 4
Disponível

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.

1
Опрос
Serialização,  23 уровень,  4 лекция
недоступен
Serialização
Serialização
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION