Como definir cabeçalhos personalizados em chamadas Python requests

PythonBeginner
Pratique Agora

Introdução

No mundo do desenvolvimento web e da recuperação de dados, entender como definir cabeçalhos personalizados em requisições Python é uma habilidade crucial. Este tutorial irá guiá-lo através do processo de adição de cabeçalhos personalizados às suas requisições Python, abrindo um amplo leque de possibilidades para web scraping, interações com APIs e muito mais.

Cabeçalhos personalizados permitem que você controle como suas requisições são processadas por servidores web e APIs. Eles podem ajudá-lo a autenticar requisições, especificar tipos de conteúdo, gerenciar caching e até mesmo imitar o comportamento de um navegador. Ao final deste tutorial, você terá o conhecimento prático para personalizar suas requisições HTTP para atender a requisitos específicos.

Entendendo os Cabeçalhos HTTP e a Biblioteca Requests

Antes de começarmos a escrever código, vamos entender o que são os cabeçalhos HTTP e por que eles são importantes.

O que são Cabeçalhos HTTP?

Os cabeçalhos HTTP são pares chave-valor enviados em requisições e respostas entre clientes e servidores. Eles fornecem informações adicionais sobre a requisição ou resposta, como o tipo de conteúdo, credenciais de autenticação ou informações do cliente.

Por exemplo, quando você visita um site, seu navegador inclui automaticamente cabeçalhos como User-Agent (identificando seu navegador), Accept (especificando quais tipos de conteúdo você pode lidar) e muito mais.

Instalando a Biblioteca Requests

A biblioteca Python Requests simplifica o trabalho com requisições HTTP. Vamos garantir que ela esteja instalada em nosso ambiente:

  1. Abra um terminal no WebIDE e execute:
pip install requests

Você deve ver uma saída indicando que o requests está sendo instalado ou já está instalado:

Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (2.28.1)
...

Criando Seu Primeiro Script Python com Requests

Vamos criar um script Python simples para testar a biblioteca requests:

  1. Clique no ícone Explorer na barra lateral esquerda do WebIDE
  2. Clique com o botão direito no explorador de arquivos e selecione "New File" (Novo Arquivo)
  3. Nomeie o arquivo test_requests.py
  4. Adicione o seguinte código ao arquivo:
import requests

## Make a simple GET request to a test website
response = requests.get('https://httpbin.org/get')

## Print the response status code
print(f"Status Code: {response.status_code}")

## Print the response headers (what the server sent back)
print("\nResponse Headers:")
for header, value in response.headers.items():
    print(f"{header}: {value}")

## Print the response content
print("\nResponse Content:")
print(response.text[:300] + "...")  ## Showing just the first 300 characters
  1. Execute o script abrindo um terminal e executando:
python test_requests.py

Você deve ver uma saída semelhante a:

Status Code: 200

Response Headers:
Date: Wed, 12 Apr 2023 10:15:23 GMT
Content-Type: application/json
Content-Length: 267
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Response Content:
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-643..."
  },
  "origin": "123.45.67.89",
  "url": "https://httpbin.org/get"
}
...

Esta saída mostra:

  1. O servidor respondeu com o código de status 200 (Sucesso)
  2. Os cabeçalhos que o servidor enviou de volta
  3. O conteúdo real da resposta (em formato JSON)

Observe que o servidor registra os cabeçalhos que recebeu de nós, incluindo o cabeçalho User-Agent gerado automaticamente, que identifica nossa requisição como vinda da biblioteca Python requests.

No próximo passo, aprenderemos como personalizar esses cabeçalhos para ter mais controle sobre nossas requisições.

Definindo Cabeçalhos Personalizados Básicos em Requisições Python

Agora que entendemos o que são os cabeçalhos HTTP e testamos a biblioteca requests, vamos aprender como definir cabeçalhos personalizados em nossas requisições.

Por que Definir Cabeçalhos Personalizados?

Existem várias razões para definir cabeçalhos personalizados:

  1. Autenticação: Muitas APIs exigem tokens de autenticação enviados em cabeçalhos
  2. User-Agent: Altere como você se identifica para sites
  3. Content-Type: Especifique o formato dos dados que você está enviando
  4. Accept: Indique quais tipos de conteúdo você pode lidar
  5. Custom Headers: Algumas APIs exigem cabeçalhos personalizados específicos

Definindo Cabeçalhos em Requisições

Vamos criar um novo script Python para praticar a definição de cabeçalhos personalizados:

  1. No WebIDE, crie um novo arquivo chamado custom_headers.py
  2. Adicione o seguinte código:
import requests

## Define the URL we'll make the request to
url = 'https://httpbin.org/headers'

## Define custom headers in a dictionary
custom_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'X-Custom-Header': 'Hello World',
    'Accept-Language': 'en-US,en;q=0.9'
}

## Make the request with our custom headers
response = requests.get(url, headers=custom_headers)

## Print the status code
print(f"Status Code: {response.status_code}")

## Print the response content (which shows the headers the server received)
print("\nHeaders received by server:")
print(response.json())
  1. Execute o script:
python custom_headers.py

Você deve ver uma saída semelhante a:

Status Code: 200

Headers received by server:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'X-Custom-Header': 'Hello World', 'X-Amzn-Trace-Id': 'Root=1-6430a123-abc123def456'}}

O que Está Acontecendo?

Neste script, nós:

  1. Criamos um dicionário chamado custom_headers contendo três cabeçalhos:

    • User-Agent: Mudamos de seu valor padrão do Python requests para imitar um navegador web
    • X-Custom-Header: Um cabeçalho totalmente personalizado que inventamos
    • Accept-Language: Especifica os idiomas preferidos para o conteúdo
  2. Passamos nossos cabeçalhos para requests.get() usando o parâmetro headers

  3. A resposta de httpbin.org/headers nos mostra exatamente quais cabeçalhos foram recebidos, confirmando que nossos cabeçalhos personalizados foram enviados com sucesso

Modificando Cabeçalhos para um Caso de Uso Específico

Vamos criar outro exemplo onde fingimos ser um dispositivo móvel. Isso pode ser útil ao testar sites responsivos para dispositivos móveis:

  1. Crie um novo arquivo chamado mobile_headers.py
  2. Adicione o seguinte código:
import requests

url = 'https://httpbin.org/headers'

## Header to simulate an iPhone
mobile_headers = {
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}

print("Making request with mobile device headers...")
response = requests.get(url, headers=mobile_headers)

## Print the response content
print(response.json())
  1. Execute o script:
python mobile_headers.py

Você deve ver uma saída semelhante a:

Making request with mobile device headers...
{'headers': {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1', 'X-Amzn-Trace-Id': 'Root=1-6430a456-abc123def456'}}

Isso mostra que estamos dizendo ao servidor com sucesso que somos um iPhone, definindo um cabeçalho User-Agent específico.

Trabalhando com Cabeçalhos de Autenticação

Um dos usos mais comuns de cabeçalhos personalizados é para autenticação com serviços web e APIs. Muitas APIs exigem que você inclua informações de autenticação em seus cabeçalhos de requisição.

Entendendo os Cabeçalhos de Autenticação

Existem vários métodos de autenticação comuns:

  1. API Keys: Tokens simples incluídos em cabeçalhos ou parâmetros de URL
  2. Basic Authentication: Nome de usuário e senha codificados em Base64
  3. Bearer Tokens: Usados em autenticação OAuth e JWT
  4. Custom Authentication: Esquemas de autenticação proprietários

Vamos explorar como implementar esses métodos de autenticação com Python requests.

Autenticação por API Key

Muitas APIs permitem acesso usando chaves de API. Elas são tipicamente incluídas em cabeçalhos ou como parâmetros de URL:

  1. Crie um novo arquivo chamado api_key_auth.py
  2. Adicione o seguinte código:
import requests

url = 'https://httpbin.org/headers'

## Simulating an API key authentication
api_key = 'my_fake_api_key_12345'

## Add the API key to the headers
headers = {
    'X-API-Key': api_key,
    'User-Agent': 'My API Client/1.0'
}

## Make the request
response = requests.get(url, headers=headers)

## Print results
print(f"Status Code: {response.status_code}")
print("\nHeaders received by server:")
print(response.json())
  1. Execute o script:
python api_key_auth.py

Você deve ver uma saída semelhante a:

Status Code: 200

Headers received by server:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'My API Client/1.0', 'X-API-Key': 'my_fake_api_key_12345', 'X-Amzn-Trace-Id': 'Root=1-6430a789-abc123def456'}}

Isso confirma que enviamos com sucesso uma chave de API no cabeçalho X-API-Key.

Basic Authentication

A autenticação básica envolve o envio de um nome de usuário e senha codificados em formato base64. A biblioteca Requests torna isso fácil:

  1. Crie um novo arquivo chamado basic_auth.py
  2. Adicione o seguinte código:
import requests

## URL that requires basic authentication
url = 'https://httpbin.org/basic-auth/user/pass'

## Method 1: Using the auth parameter (recommended)
print("Method 1: Using the auth parameter")
response = requests.get(url, auth=('user', 'pass'))
print(f"Status Code: {response.status_code}")
print(response.json())

## Method 2: Setting the Authorization header manually
print("\nMethod 2: Setting the Authorization header manually")
import base64

## Create the basic auth string: "username:password" encoded in base64
auth_string = base64.b64encode('user:pass'.encode('utf-8')).decode('utf-8')
headers = {
    'Authorization': f'Basic {auth_string}'
}

response = requests.get(url, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json())
  1. Execute o script:
python basic_auth.py

Você deve ver uma saída semelhante a:

Method 1: Using the auth parameter
Status Code: 200
{'authenticated': True, 'user': 'user'}

Method 2: Setting the Authorization header manually
Status Code: 200
{'authenticated': True, 'user': 'user'}

Ambos os métodos autenticaram com sucesso com o serviço:

  • O Método 1 usa o parâmetro auth embutido, que é mais conveniente
  • O Método 2 mostra como a autenticação básica funciona "por baixo dos panos" criando manualmente o cabeçalho Authorization

Bearer Token Authentication

A autenticação por token Bearer é comumente usada em sistemas baseados em OAuth 2.0 e JWT:

  1. Crie um novo arquivo chamado bearer_auth.py
  2. Adicione o seguinte código:
import requests

url = 'https://httpbin.org/headers'

## Simulate a bearer token (in a real app this would come from an OAuth process)
bearer_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.Q6CM1qIQkXA_DqyJq9MI0-mnRRCRR3c0SIM-Nul5MZs'

## Add the Authorization header with the Bearer token
headers = {
    'Authorization': f'Bearer {bearer_token}'
}

## Make the request
response = requests.get(url, headers=headers)

## Print results
print(f"Status Code: {response.status_code}")
print("\nHeaders received by server:")
print(response.json())
  1. Execute o script:
python bearer_auth.py

Você deve ver uma saída semelhante a:

Status Code: 200

Headers received by server:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.Q6CM1qIQkXA_DqyJq9MI0-mnRRCRR3c0SIM-Nul5MZs', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430a901-abc123def456'}}

Isso mostra uma requisição bem-sucedida com um token Bearer incluído no cabeçalho Authorization.

Tokens Bearer são tipicamente obtidos após um processo de autenticação bem-sucedido com um servidor OAuth 2.0, mas neste exemplo, estamos usando um token de amostra para fins de demonstração.

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:

  1. Crie um novo arquivo chamado json_requests.py
  2. 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']}")
  1. 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:

  1. Crie um novo arquivo chamado session_headers.py
  2. 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())
  1. 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:

  1. Melhor desempenho (pooling de conexões)
  2. Cabeçalhos consistentes em todas as requisições
  3. Tratamento automático de cookies
  4. 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:

  1. Use Objetos Session para múltiplas requisições ao mesmo domínio
  2. Defina os Cabeçalhos Content-Type corretamente para os dados que você está enviando
  3. Lide com a Autenticação Adequadamente - use a autenticação embutida quando possível
  4. Mantenha Informações Sensíveis Seguras - não codifique chaves de API ou tokens
  5. Siga a Documentação da API cuidadosamente para os cabeçalhos necessários

Aqui está um exemplo final que demonstra essas melhores práticas:

  1. Crie um novo arquivo chamado best_practices.py
  2. 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()
  1. 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.

Resumo

Neste tutorial, você aprendeu como trabalhar com cabeçalhos personalizados em Python requests, o que é uma habilidade essencial para uma comunicação web eficaz e integração de API.

Agora você entende:

  • O que são cabeçalhos HTTP e por que eles são importantes para requisições web
  • Como definir cabeçalhos personalizados para requisições individuais
  • Vários métodos de autenticação usando cabeçalhos (chaves de API, Basic auth, Bearer tokens)
  • Como trabalhar corretamente com dados JSON e cabeçalhos de tipo de conteúdo
  • Melhores práticas para gerenciar cabeçalhos com objetos de sessão

Essas habilidades permitirão que você interaja com qualquer API web de forma mais eficaz, acesse recursos protegidos, controle como suas requisições são processadas e construa aplicações web mais sofisticadas.

À medida que você continua a desenvolver suas habilidades em Python, lembre-se de que a compreensão dos fundamentos do HTTP, como cabeçalhos, códigos de status e tipos de conteúdo, o ajudará a solucionar problemas e implementar recursos mais avançados em suas aplicações web.