Skip to content
beginner Phase 9 · Python APIs & Web

HTTP Clients & APIs

Consume external APIs with requests library and handle authentication.

1h
0 problems
Topic Progress 0%

Requests Basics

Installation

pip install requests

GET Request

import requests

# Basic GET
response = requests.get('https://api.github.com/user')

# With parameters
params = {'q': 'python', 'page': 1}
response = requests.get('https://api.github.com/search/repositories', params=params)

# Access response
print(response.status_code)  # 200
print(response.headers)      # Response headers
print(response.text)         # Response body as string
print(response.json())       # Parse JSON
print(response.content)      # Response body as bytes
print(response.url)          # Final URL

Other HTTP Methods

# POST
response = requests.post('https://api.example.com/data', json={'key': 'value'})

# PUT
response = requests.put('https://api.example.com/data/1', json={'key': 'new_value'})

# PATCH
response = requests.patch('https://api.example.com/data/1', json={'key': 'patched'})

# DELETE
response = requests.delete('https://api.example.com/data/1')

# HEAD
response = requests.head('https://api.example.com/')

# OPTIONS
response = requests.options('https://api.example.com/')

Response Object

response = requests.get('https://api.github.com')

# Status code
print(response.status_code)     # 200
print(response.ok)              # True (status < 400)
print(response.reason)          # 'OK'

# Headers
print(response.headers)         # Case-insensitive dict
print(response.headers['Content-Type'])

# Content
print(response.text)            # String
print(response.content)         # Bytes
print(response.json())          # Parsed JSON
print(response.encoding)        # 'utf-8'

# Time
print(response.elapsed)         # Timedelta

Errors

import requests
from requests.exceptions import HTTPError, ConnectionError, Timeout

try:
    response = requests.get('https://api.example.com/data')
    response.raise_for_status()  # Raises HTTPError for 4xx/5xx
except HTTPError as e:
    print(f'HTTP error: {e}')
except ConnectionError as e:
    print(f'Connection error: {e}')
except Timeout as e:
    print(f'Timeout error: {e}')
except requests.RequestException as e:
    print(f'Request error: {e}')

Advanced Requests

Headers and Authentication

# Custom headers
headers = {
    'Authorization': 'Bearer token123',
    'Content-Type': 'application/json',
    'X-Custom-Header': 'value'
}
response = requests.get('https://api.example.com', headers=headers)

# Basic Auth
response = requests.get('https://api.example.com', auth=('user', 'pass'))

# Bearer Token
headers = {'Authorization': 'Bearer mytoken123'}
response = requests.get('https://api.example.com', headers=headers)

# API Key
params = {'api_key': 'mykey123'}
response = requests.get('https://api.example.com', params=params)

Sessions

import requests

# Using session (connection pooling)
session = requests.Session()

# Set default headers
session.headers.update({'Authorization': 'Bearer token123'})

# All requests use same connection
response1 = session.get('https://api.example.com/data1')
response2 = session.get('https://api.example.com/data2')

# Session persists cookies
session.get('https://example.com/login')
# Cookies from login are reused

Timeouts

# Timeout in seconds
response = requests.get('https://api.example.com', timeout=5)

# Different timeouts for connect and read
response = requests.get('https://api.example.com', timeout=(3, 10))
# 3 seconds to connect, 10 seconds to read

# No timeout (dangerous!)
response = requests.get('https://api.example.com', timeout=None)

SSL Verification

# Disable SSL verification (not recommended for production)
response = requests.get('https://self-signed.example.com', verify=False)

# Use custom CA bundle
response = requests.get('https://api.example.com', verify='/path/to/certfile')

Streaming Downloads

# Stream large file
response = requests.get('https://example.com/large-file.zip', stream=True)

with open('file.zip', 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)

# Or using Response.iter_lines()
for line in response.iter_lines():
    if line:
        print(line.decode('utf-8'))

Best Practices

# ✅ Always use timeout
response = requests.get(url, timeout=10)

# ✅ Check status codes
response.raise_for_status()

# ✅ Use sessions for multiple requests
session = requests.Session()

# ✅ Handle JSON properly
data = response.json()

# ✅ Use appropriate HTTP methods
# GET for reading, POST for creating, PUT for updating, DELETE for deleting

# ❌ Don't disable SSL verification in production
# ❌ Don't ignore timeouts
# ❌ Don't catch all exceptions (use specific ones)