Python : Manipulating HTTP APIs
Hello everyone, this is a list of helpful functions for manipulating APIs in Python.
Sending data to an API endpoint using a GET request.
import requests
response = requests.get('https://api.example.com/get')
data = response.json()
print(data)
Sending data to an API endpoint using a POST request.
import requests
data_to_send = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://api.example.com/submit', json=data_to_send)
data = response.json()
print(data)
Updating data at an API endpoint using a PUT request.
import requests
data_to_update = {'key1': 'newvalue'}
response = requests.put('https://api.example.com/update/123', json=data_to_update)
print(response.status_code) # 200, 201, 204 etc. indicates success
Deleting data at an API endpoint using a DELETE request.
import requests
response = requests.delete('https://api.example.com/delete/123')
print(response.status_code) # 200, 204 etc., indicates success
Sending a request with custom HTTP headers.
import requests
headers = {'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Accept':'application/json'}
response = requests.get('https://api.example.com/secure-data', headers=headers)
data = response.json()
print(data)
Setting a timeout for a request.
import requests
try:
response = requests.get('https://api.example.com/data', timeout=5) # Timeout in seconds
data = response.json()
print(data)
except requests.exceptions.Timeout:
print("The request timed out")
Using sessions to persist parameters across requests.
import requests
# Create a session
s = requests.Session()
s.headers.update({'User-Agent': 'Custom User Agent'})
# Set a cookie
s.cookies.set('session_cookie', 'id_session_1234567890')
# Use the session to make requests
response = s.get('https://api.example.com/data')
print(response.text)
Downloading large files in chunks.
import requests
response = requests.get('https://api.example.com/large-file', stream=True)
with open('large_file', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
Skipping SSL certification verification in requests (not recommended for production).
import requests
response = requests.get('https://api.example.com/secure', verify=False)
print(response.text)
Making requests through a proxy.
import requests
proxies = {'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.11:1080'}
response = requests.get('https://api.example.com/data', proxies=proxies)
print(response.text)
Include basic authentication in your request.
import requests
from requests.auth import HTTPBasicAuth
response = requests.get(
'https://api.example.com/auth-required',
auth=HTTPBasicAuth('username', 'password')
)
print(response.json())
Using OAuth 2.0 for authentication typically requires you to first make a POST request to obtain the access token and then use it in the header for other request to get data
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
response = requests.get('https://api.example.com/oauth-data', headers=headers)
print(response.json())
Set a custom User-Agent header in your request.
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1'}
response = requests.get('https://api.example.com/data', headers=headers)
print(response.json())
Send partial modifications to a resource using PATCH.
import requests
data_to_patch = {'key1': 'updatedValue'}
response = requests.patch('https://api.example.com/update/456', json=data_to_patch)
print(response.json())
Retrieve the headers from an endpoint.
import requests
response = requests.head('https://api.example.com/data')
print(response.headers)
Determine the supported HTTP methods of an endpoint.
import requests
response = requests.options('https://api.example.com/data')
print(response.headers.get('allow')) # e.g., GET, POST, OPTIONS
Accessing specific response headers.
import requests
response = requests.get('https://api.example.com/data')
content_type = response.headers.get('Content-Type')
print(content_type)
Making a request with If-Modified-Since header.
import requests
headers = {
'If-Modified-Since': 'Sat, 29 Oct 1994 19:43:31 GMT'
}
response = requests.get('https://api.example.com/data', headers=headers)
if response.status_code == 304:
print('Not Modified')
else:
print(response.json())
Send files using multipart/form-data encoding.
import requests
files = {'file': open('report.csv', 'rb')}
response = requests.post('https://api.example.com/upload', files=files)
print(response.status_code)
Handling API responses that return JSON.
import requests
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
try:
data = response.json()
print(data)
except ValueError:
print("Response isn't JSON format")
else:
print(f"Failed to get data, status code: {response.status_code}")
Implement basic rate limiting to avoid hitting API request limits.
import requests
import time
def rate_limited_get(url):
response = requests.get(url)
if response.status_code == 429:
time.sleep(10) # Wait for 10 seconds before trying again
return rate_limited_get(url)
return response
response = rate_limited_get('https://api.example.com/data')
print(response.json())
Re-use a session object for multiple requests to take advantage of persistent connections.
import requests
with requests.Session() as session:
session.headers.update({'Authorization': 'Bearer YOUR_ACCESS_TOKEN'})
response_one = session.get('https://api.example.com/data1')
response_two = session.get('https://api.example.com/data2')
print(response_one.json())
print(response_two.json())
Catching and handling different types of exceptions.
import requests
try:
response = requests.get('https://api.example.com/data')
response.raise_for_status()
except requests.exceptions.HTTPError as errh:
print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
print("Oops: Something Else", err)
Hope these functions and examples help you when working with APIs.