blog image

Python : Manipulating HTTP APIs

Hello everyone, this is a list of helpful functions for manipulating APIs in Python.

0. GET Request

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)

1. POST Request

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)

2. PUT Request

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

3. DELETE Request

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

4. Custom Headers

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)

5. Timeout

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")

6. Sessions with Cookies

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)

7. Stream Large Files

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)

8. SSL Verification

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)

9. Proxy

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)

10. Basic Authentication

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())

11. OAuth 2 Authentication

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())

12. Custom User-Agent

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())

13. Using PATCH Request

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())

14. HEAD Request

Retrieve the headers from an endpoint.

import requests

response = requests.head('https://api.example.com/data')
print(response.headers)

15. OPTIONS Request

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

16. Response Headers

Accessing specific response headers.

import requests

response = requests.get('https://api.example.com/data')
content_type = response.headers.get('Content-Type')
print(content_type)

17. Conditional Requests

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())

18. Uploading Files

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)

19. JSON Response Handling

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}")


20. Rate Limiting

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())

21. Session Persistence with requests.Session

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())

21. Advanced Error Handling

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.

Leave a Reply

Your email address will not be published. Required fields are marked *