What are the main HTTP methods and when should you use each one?
HTTP defines several methods (verbs) that indicate the desired action on a resource:
| Method | Purpose | Idempotent | Safe | Has Body |
|---|---|---|---|---|
| GET | Retrieve a resource | Yes | Yes | No |
| POST | Create a new resource | No | No | Yes |
| PUT | Replace an entire resource | Yes | No | Yes |
| PATCH | Partially update a resource | No* | No | Yes |
| DELETE | Remove a resource | Yes | No | Optional |
| HEAD | Like GET but returns only headers | Yes | Yes | No |
| OPTIONS | Returns supported methods for a URL | Yes | Yes | No |
Idempotent means making the same request multiple times has the same effect as making it once. GET, PUT, DELETE are idempotent. POST is not (each call may create a new resource).
Safe means the request does not modify server state. GET, HEAD, OPTIONS are safe.
*PATCH is technically not guaranteed idempotent by the spec, though implementations often make it so.
GET /users -> List all users
GET /users/123 -> Get user 123
POST /users -> Create a new user
PUT /users/123 -> Replace user 123 entirely
PATCH /users/123 -> Update specific fields of user 123
DELETE /users/123 -> Delete user 123
HEAD /users -> Check if /users exists (headers only)
OPTIONS /users -> What methods does /users support?
import requests
base_url = 'https://api.example.com'
# GET - Retrieve
response = requests.get(f'{base_url}/users')
users = response.json()
response = requests.get(f'{base_url}/users/123')
user = response.json()
# POST - Create
response = requests.post(f'{base_url}/users', json={
'name': 'Alice',
'email': 'alice@example.com'
})
new_user = response.json() # Includes generated id
# PUT - Full replace
response = requests.put(f'{base_url}/users/123', json={
'name': 'Alice Updated',
'email': 'alice_new@example.com',
'age': 30 # Must include ALL fields
})
# PATCH - Partial update
response = requests.patch(f'{base_url}/users/123', json={
'name': 'Alice Patched' # Only the fields to change
})
# DELETE - Remove
response = requests.delete(f'{base_url}/users/123')
# HEAD - Headers only (no body)
response = requests.head(f'{base_url}/users')
print(response.headers['Content-Length'])
# OPTIONS - Supported methods
response = requests.options(f'{base_url}/users')
print(response.headers.get('Allow')) # e.g., 'GET, POST, OPTIONS'
- •GET retrieves data (safe, idempotent); POST creates (not idempotent)
- •PUT replaces the full resource; PATCH updates specific fields
- •DELETE removes a resource; idempotent (deleting twice returns 404 the second time)
- •HEAD is like GET but returns only headers (useful for checking existence or size)
- •Idempotent means repeated requests have the same effect
- •PUT requires sending the complete resource; omitting a field may set it to null
- •POST is not idempotent: retrying a failed POST may create duplicate resources
- •Some APIs misuse POST for everything; proper method usage improves cacheability and semantics