Try it yourself with our free Curl Converter tool — runs entirely in your browser, no signup needed.

How to Make HTTP requests in Python

How to make HTTP requests in Python

Making HTTP requests is a fundamental task in web development, allowing your application to interact with web servers, APIs, and microservices. In Python, the requests library provides a simple and intuitive way to make HTTP requests. In this guide, we will explore how to make HTTP requests in Python using the requests library.

Quick Example

Here is a minimal example of making a GET request to the GitHub API:

import requests

url = "https://api.github.com/users/octocat"
response = requests.get(url)

if response.status_code == 200:
    print(response.json())
else:
    print("Failed to retrieve data")

This code sends a GET request to the GitHub API, retrieves the response, and prints the JSON data if the request is successful.

Step-by-Step Breakdown

Let's walk through the code line by line:

  1. import requests: We import the requests library, which is the most popular and widely-used library for making HTTP requests in Python. You can install it using pip: pip install requests
  2. url = "https://api.github.com/users/octocat": We define the URL we want to request. In this case, we're requesting the GitHub API endpoint for the user "octocat".
  3. response = requests.get(url): We use the requests.get() method to send a GET request to the specified URL. The get() method returns a Response object, which contains the server's response to our request.
  4. if response.status_code == 200:: We check the status code of the response to see if the request was successful. A status code of 200 indicates a successful request.
  5. print(response.json()): If the request was successful, we print the JSON data returned by the server using the response.json() method.
  6. else: print("Failed to retrieve data"): If the request was not successful, we print an error message.

Handling Edge Cases

Here are some common edge cases to consider when making HTTP requests:

Empty/Null Input

url = None
try:
    response = requests.get(url)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

In this example, we pass None as the URL, which raises a RequestException. We catch the exception and print an error message.

Invalid Input

url = "invalid url"
try:
    response = requests.get(url)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

In this example, we pass an invalid URL, which raises a RequestException. We catch the exception and print an error message.

Large Input

import requests

url = "https://api.github.com/users/octocat"
params = {"per_page": 1000}  # large page size
response = requests.get(url, params=params)

In this example, we pass a large page size as a query parameter, which may cause the server to return a large response. We use the params parameter to pass the query parameters.

Unicode/Special Characters

import requests

url = "https://api.github.com/users/octocat"
params = {"username": "octocat 🐈"}  # unicode character
response = requests.get(url, params=params)

In this example, we pass a Unicode character as a query parameter, which may cause issues with some servers. We use the params parameter to pass the query parameters.

Common Mistakes

Here are some common mistakes developers make when making HTTP requests:

Mistake 1: Not Handling Exceptions

# wrong code
response = requests.get(url)

# correct code
try:
    response = requests.get(url)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

Not handling exceptions can cause your program to crash if an error occurs.

Mistake 2: Not Checking Status Code

# wrong code
response = requests.get(url)
print(response.json())

# correct code
response = requests.get(url)
if response.status_code == 200:
    print(response.json())
else:
    print("Failed to retrieve data")

Not checking the status code can cause your program to fail if the request is not successful.

Mistake 3: Not Using Query Parameters

# wrong code
url = f"https://api.github.com/users/{username}"
response = requests.get(url)

# correct code
url = "https://api.github.com/users"
params = {"username": username}
response = requests.get(url, params=params)

Not using query parameters can cause issues with URL encoding and security.

Performance Tips

Here are some performance tips for making HTTP requests:

  1. Use Connection Pooling: The requests library uses connection pooling by default, which can improve performance by reusing existing connections.
  2. Use Caching: You can use caching libraries like requests-cache to cache frequently requested resources.
  3. Use Asynchronous Requests: You can use libraries like aiohttp to make asynchronous requests, which can improve performance by allowing your program to continue executing while waiting for responses.

FAQ

Q: What is the difference between requests.get() and requests.post()?

A: requests.get() is used for retrieving data from a server, while requests.post() is used for sending data to a server.

Q: How do I handle SSL verification errors?

A: You can use the verify parameter to disable SSL verification: requests.get(url, verify=False)

Q: How do I set a timeout for my request?

A: You can use the timeout parameter to set a timeout: requests.get(url, timeout=5)

Q: How do I add headers to my request?

A: You can use the headers parameter to add headers: requests.get(url, headers={"Accept": "application/json"})

Q: How do I handle redirects?

A: You can use the allow_redirects parameter to disable redirects: requests.get(url, allow_redirects=False)

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp