API Call Techniques
Pagination Handling
def fetch_all_data(base_url):
page = 1
all_data = []
while True:
response = requests.get(f'{base_url}?page={page}')
data = response.json()
if not data:
break
all_data.extend(data)
page += 1
return all_data
Retry Mechanism
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
def create_retry_session(retries=3):
session = requests.Session()
retry_strategy = Retry(
total=retries,
status_forcelist=[429, 500, 502, 503, 504],
method_whitelist=["HEAD", "GET", "OPTIONS"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("https://", adapter)
session.mount("http://", adapter)
return session
Concurrent API Calls
import concurrent.futures
import requests
def fetch_url(url):
response = requests.get(url)
return response.json()
def concurrent_api_calls(urls):
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
results = list(executor.map(fetch_url, urls))
return results
Rate Limiting Techniques
import time
import requests
class RateLimitedAPI:
def __init__(self, calls_per_minute):
self.calls_per_minute = calls_per_minute
self.interval = 60 / calls_per_minute
def call_api(self, url):
time.sleep(self.interval)
return requests.get(url)
API Call Workflow
graph TD
A[Prepare Request] --> B[Send Request]
B --> C{Validate Response}
C -->|Success| D[Process Data]
C -->|Error| E[Handle Error]
D --> F[Cache/Store Result]
Authentication Strategies
Strategy |
Description |
Use Case |
API Key |
Simple token-based |
Public APIs |
OAuth |
Secure delegated access |
Complex auth flows |
JWT |
Stateless authentication |
Microservices |
Error Handling Patterns
def robust_api_call(url, max_retries=3):
for attempt in range(max_retries):
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt)
Caching Strategies
import requests
import functools
@functools.lru_cache(maxsize=100)
def cached_api_call(url):
response = requests.get(url)
return response.json()
- Use session objects
- Implement connection pooling
- Minimize request payload
- Use compression
- Implement intelligent caching
Advanced Techniques
- GraphQL API interactions
- WebSocket communication
- Streaming large responses
- Asynchronous API calls
At LabEx, we recommend mastering these advanced API call techniques to build robust and efficient Python applications.