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