Skip to content

HTTP Requests with requests

What is an HTTP request?

An HTTP request asks a server for something.

Common verbs:

  • GETGET: fetch data
  • POSTPOST: send data
  • PUT/PATCHPUT/PATCH: update
  • DELETEDELETE: remove

GET request

get_request.py
import requests
 
url = "https://api.github.com"
r = requests.get(url, timeout=10)
 
print(r.status_code)
print(r.headers.get("content-type"))
print(r.json().keys())
get_request.py
import requests
 
url = "https://api.github.com"
r = requests.get(url, timeout=10)
 
print(r.status_code)
print(r.headers.get("content-type"))
print(r.json().keys())

Query parameters

params.py
import requests
 
url = "https://api.github.com/search/repositories"
params = {"q": "python", "sort": "stars", "per_page": 5}
 
r = requests.get(url, params=params, timeout=10)
r.raise_for_status()
 
data = r.json()
print("count:", data["total_count"])
for item in data["items"]:
    print(item["full_name"], item["stargazers_count"])
params.py
import requests
 
url = "https://api.github.com/search/repositories"
params = {"q": "python", "sort": "stars", "per_page": 5}
 
r = requests.get(url, params=params, timeout=10)
r.raise_for_status()
 
data = r.json()
print("count:", data["total_count"])
for item in data["items"]:
    print(item["full_name"], item["stargazers_count"])

POST JSON

post_json.py
import requests
 
url = "https://httpbin.org/post"
payload = {"name": "ravi", "role": "learner"}
 
r = requests.post(url, json=payload, timeout=10)
r.raise_for_status()
 
print(r.json()["json"])  # echoed back
post_json.py
import requests
 
url = "https://httpbin.org/post"
payload = {"name": "ravi", "role": "learner"}
 
r = requests.post(url, json=payload, timeout=10)
r.raise_for_status()
 
print(r.json()["json"])  # echoed back

Timeouts and retries

Always set timeouts

Without a timeout, a request can hang forever.

Basic retry pattern

retry_pattern.py
import time
import requests
 
url = "https://httpbin.org/status/503"
 
for attempt in range(3):
    try:
        r = requests.get(url, timeout=5)
        r.raise_for_status()
        print("success")
        break
    except requests.RequestException as e:
        print("attempt failed:", attempt + 1, e)
        time.sleep(1)
else:
    print("all retries failed")
retry_pattern.py
import time
import requests
 
url = "https://httpbin.org/status/503"
 
for attempt in range(3):
    try:
        r = requests.get(url, timeout=5)
        r.raise_for_status()
        print("success")
        break
    except requests.RequestException as e:
        print("attempt failed:", attempt + 1, e)
        time.sleep(1)
else:
    print("all retries failed")

Good practice checklist

  • Use timeout=timeout=
  • Call raise_for_status()raise_for_status() for non-2xx responses
  • Don’t log secrets (API keys)

πŸ§ͺ Try It Yourself

Exercise 1 – GET Request

Exercise 2 – POST with JSON

Exercise 3 – Handle Timeout

If this helped you, consider buying me a coffee β˜•

Buy me a coffee

Was this page helpful?

Let us know how we did