4.1 Processamento de respostas
O módulo requests fornece métodos convenientes para trabalhar com as respostas do servidor.
Códigos de status
Além da resposta, o servidor ainda envia o status do processamento da solicitação. A informação sobre o status está nos campos status_code e reason. Veja o exemplo abaixo:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # Exibe o código de status da resposta
print(response.reason) # Exibe a descrição textual do status
print(response.ok) # Retorna True, se o código de status for menor que 400
Cabeçalhos
E claro, qual é a solicitação HTTP sem cabeçalhos? Se você precisa dos cabeçalhos da solicitação ou da resposta, pode acessá-los através do campo headers:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # Exibe os cabeçalhos da resposta
print(response.headers['Content-Type']) # Exibe o valor de um cabeçalho específico
Corpo da resposta
A resposta do servidor pode conter um conjunto de bytes, texto, json ou xml. Se você sabe exatamente o que está solicitando do servidor, pode obter o objeto do tipo necessário imediatamente, usando um dos métodos/campos:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # Exibe o corpo da resposta como texto
print(response.json()) # Exibe o corpo da resposta como JSON
print(response.content) # Exibe o corpo da resposta como bytes
Você aprenderá mais sobre cabeçalhos (headers) e status de resposta nas aulas sobre como a rede funciona.
4.2 Tratamento de erros
O módulo requests fornece exceções para lidar com erros.
O padrão HTTP não prevê exceções, em vez disso ele trabalha com códigos de erro (status_code). Se você deseja que uma exceção Python seja gerada em um resultado de solicitação mal-sucedido, você precisa explicitamente chamar a função raise_for_status().
Exemplo:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # Gera exceção para códigos de status 4xx e 5xx
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"Other error occurred: {err}")
else:
print("Success!")
Você pode aprender mais sobre códigos de erro nas aulas sobre como a rede funciona.
4.3 Envio de dados
Antes da invenção do JSON, grandes volumes de dados eram enviados por "forma". A forma é um objeto especial da página do navegador (e padrão de dados em HTTP). Se você deseja enviar dados "por forma", você só precisa passar o parâmetro data junto com a solicitação.
Importante! Solicitações GET não suportam formas, porque não contêm corpo de solicitação. Todos os seus dados são passados apenas na URL.
Envio de dados em GET-request
Em GET-request, os dados são passados por parâmetros de URL. Aqui está um exemplo:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # Exibirá a URL com os parâmetros adicionados
Envio de dados por forma
Vamos usar um POST-request para enviar dados ao servidor.
Exemplo:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
Envio de arquivos
Se você deseja enviar dados binários pela internet, por exemplo, fazer upload de uma imagem, você precisa passar seu arquivo ou arquivos na solicitação usando o parâmetro files.
Exemplo:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
Simples como dois e dois. Se você deseja enviar vários arquivos, liste-os com quaisquer nomes na variável files.
Importante! Não esqueça de fechar o arquivo após o envio para evitar vazamento de recursos. É melhor usar a construção with, que fechará automaticamente o arquivo após o fim da operação:
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 Login e autorização
API (Application Programming Interface) é um conjunto de regras e protocolos que permitem que diferentes programas interajam entre si. Muitos sites e serviços permitem que você envie solicitações e trabalhe com sua API apenas após o login.
Após um login bem-sucedido, você recebe um objeto especial – uma sessão (session), que contém um número único da sua "sessão autorizada com o servidor". Para solicitações futuras, você precisará usar esse objeto.
Autenticação
Para fazer login no servidor, você precisa fazer a autenticação (processo de login), para o qual é necessário passar as credenciais junto com a solicitação.
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
É assim que se parece o processo de autorização, mas geralmente ele é usado junto com a sessão.
Uso de sessões
As sessões permitem salvar parâmetros entre as solicitações, como cookies ou informações de autorização do usuário.
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# Criação de sessão
session = requests.Session()
# Login no site
login_response = session.post('https://example.com/login', data = payload)
# Trabalho adicional sob a sessão do usuário logado
data_response = session.get('https://example.com/api/data')
print(data_response.json())
GO TO FULL VERSION