Aplicações Práticas e Melhores Práticas
Agora que você aprendeu como definir vários tipos de cabeçalhos personalizados, vamos explorar algumas aplicações práticas e melhores práticas para trabalhar com cabeçalhos em cenários do mundo real.
Enviando e Recebendo Dados JSON
Ao trabalhar com APIs modernas, JSON é o formato de dados mais comum. Vamos ver como definir corretamente os cabeçalhos para requisições JSON:
- Crie um novo arquivo chamado
json_requests.py
- Adicione o seguinte código:
import requests
import json
url = 'https://httpbin.org/post' ## This endpoint accepts POST requests
## Data to send
data = {
'name': 'John Doe',
'email': 'john@example.com',
'message': 'Hello, world!'
}
## Set appropriate headers for JSON
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
## Method 1: Using the json parameter (recommended)
print("Method 1: Using the json parameter")
response = requests.post(url, json=data, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json()['headers']) ## Show the headers received
print(f"\nData sent (as received by server): {response.json()['json']}")
## Method 2: Manually converting to JSON
print("\nMethod 2: Manually converting to JSON")
json_data = json.dumps(data)
response = requests.post(url, data=json_data, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json()['headers']) ## Show the headers received
print(f"\nData sent (as received by server): {response.json()['json']}")
- Execute o script:
python json_requests.py
Você deve ver uma saída semelhante a:
Method 1: Using the json parameter
Status Code: 200
{'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '72', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430ab12-abc123def456'}
Data sent (as received by server): {'name': 'John Doe', 'email': 'john@example.com', 'message': 'Hello, world!'}
Method 2: Manually converting to JSON
Status Code: 200
{'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '72', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430ab13-abc123def456'}
Data sent (as received by server): {'name': 'John Doe', 'email': 'john@example.com', 'message': 'Hello, world!'}
Observe que ambos os métodos funcionam, mas o Método 1 é mais conveniente porque a biblioteca Requests lida com a conversão JSON para você.
Criando uma Sessão Reutilizável com Cabeçalhos Padrão
Se você precisar fazer várias requisições com os mesmos cabeçalhos, usar um objeto Session pode economizar tempo e tornar seu código mais limpo:
- Crie um novo arquivo chamado
session_headers.py
- Adicione o seguinte código:
import requests
## Create a session object
session = requests.Session()
## Set default headers for all requests made with this session
session.headers.update({
'User-Agent': 'MyCustomApp/1.0',
'Accept-Language': 'en-US,en;q=0.9',
'X-API-Key': 'my_session_api_key'
})
## Make a request using the session - it will include our default headers
print("First request with session:")
response = session.get('https://httpbin.org/headers')
print(response.json())
## Add a custom header just for this request
print("\nSecond request with additional header:")
response = session.get('https://httpbin.org/headers',
headers={'X-Custom-Header': 'Just for this request'})
print(response.json())
## Original headers remain unchanged for future requests
print("\nThird request (original headers only):")
response = session.get('https://httpbin.org/headers')
print(response.json())
- Execute o script:
python session_headers.py
Você deve ver uma saída semelhante a:
First request with session:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab45-abc123def456'}}
Second request with additional header:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Custom-Header': 'Just for this request', 'X-Amzn-Trace-Id': 'Root=1-6430ab46-abc123def456'}}
Third request (original headers only):
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab47-abc123def456'}}
Usar sessões é uma melhor prática por várias razões:
- Melhor desempenho (pooling de conexões)
- Cabeçalhos consistentes em todas as requisições
- Tratamento automático de cookies
- Capacidade de adicionar personalização por requisição quando necessário
Melhores Práticas para Trabalhar com Cabeçalhos
Para concluir, aqui estão algumas melhores práticas a serem seguidas ao trabalhar com cabeçalhos HTTP:
- Use Objetos Session para múltiplas requisições ao mesmo domínio
- Defina os Cabeçalhos Content-Type corretamente para os dados que você está enviando
- Lide com a Autenticação Adequadamente - use a autenticação embutida quando possível
- Mantenha Informações Sensíveis Seguras - não codifique chaves de API ou tokens
- Siga a Documentação da API cuidadosamente para os cabeçalhos necessários
Aqui está um exemplo final que demonstra essas melhores práticas:
- Crie um novo arquivo chamado
best_practices.py
- Adicione o seguinte código:
import requests
import os
## In a real application, get these from environment variables or a secure configuration
## For this example, we're keeping it simple
API_KEY = os.environ.get('API_KEY', 'default_api_key')
BASE_URL = 'https://httpbin.org'
def create_api_client():
"""Create a reusable session with default headers."""
session = requests.Session()
## Set common headers
session.headers.update({
'User-Agent': 'MyApp/1.0',
'X-API-Key': API_KEY,
'Accept': 'application/json'
})
return session
def get_data(client, endpoint):
"""Make a GET request to the specified endpoint."""
url = f"{BASE_URL}/{endpoint}"
response = client.get(url)
return response.json()
def post_data(client, endpoint, data):
"""Make a POST request with JSON data."""
url = f"{BASE_URL}/{endpoint}"
response = client.post(url, json=data)
return response.json()
## Usage example
def main():
## Create the API client
client = create_api_client()
## GET request example
print("Making GET request...")
get_response = get_data(client, 'headers')
print(f"Headers sent: {get_response['headers']}")
## POST request example
print("\nMaking POST request...")
data = {'name': 'John', 'age': 30}
post_response = post_data(client, 'post', data)
print(f"Data received by server: {post_response['json']}")
if __name__ == '__main__':
main()
- Execute o script:
python best_practices.py
Você deve ver uma saída semelhante a:
Making GET request...
Headers sent: {'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'MyApp/1.0', 'X-API-Key': 'default_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab78-abc123def456'}
Making POST request...
Data received by server: {'name': 'John', 'age': 30}
Este exemplo demonstra uma abordagem estruturada para fazer requisições HTTP com cabeçalhos personalizados, seguindo as melhores práticas, como criar sessões reutilizáveis, organizar o código em funções e evitar informações sensíveis codificadas.