Python > Working with External Resources > Networking > HTTP Clients (`requests` library)
Sending POST Requests with JSON Data
This snippet demonstrates how to send a POST request with JSON data to a server using the `requests` library. It shows how to construct a JSON payload and handle the server's response.
Code
This code sends an HTTP POST request to the URL 'https://jsonplaceholder.typicode.com/posts' with a JSON payload. The `data` dictionary represents the JSON data to be sent. The `headers` dictionary specifies the `Content-Type` header as `application/json`, indicating that the request body contains JSON data. The `requests.post()` function automatically serializes the `data` dictionary to JSON. The response is then parsed as JSON, and both the data and status code are printed. Similar to the first example, robust error handling is included.
import requests
import json
url = 'https://jsonplaceholder.typicode.com/posts'
data = {
'title': 'foo',
'body': 'bar',
'userId': 1
}
headers = {'Content-type': 'application/json'}
try:
response = requests.post(url, json=data, headers=headers)
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
response_data = response.json()
print(f'Response Data: {response_data}')
print(f'Status Code: {response.status_code}')
except requests.exceptions.HTTPError as errh:
print(f'HTTP Error: {errh}')
except requests.exceptions.ConnectionError as errc:
print(f'Connection Error: {errc}')
except requests.exceptions.Timeout as errt:
print(f'Timeout Error: {errt}')
except requests.exceptions.RequestException as err:
print(f'Something went wrong: {err}')
Concepts Behind the Snippet
This snippet builds upon the previous example by demonstrating how to send data to a server using the POST method and the JSON format. Key concepts include:
Real-Life Use Case
This is crucial when interacting with RESTful APIs. Imagine creating a new user account on a website. Your application would need to send the user's information (username, password, email, etc.) to the server using a POST request with a JSON payload. Similarly, you could use a POST request to update product information in an e-commerce system or submit a blog post to a content management system.
Best Practices
When sending POST requests with JSON data:
Interview Tip
Be prepared to discuss the differences between GET and POST requests, the importance of the `Content-Type` header, and how to handle different types of data (JSON, form data). Also, understand the role of HTTP status codes in determining the success or failure of a request.
When to Use Them
Use POST requests with JSON data when you need to send structured data to a server to create, update, or process a resource. This is the standard approach for interacting with most modern RESTful APIs.
Memory Footprint
The memory footprint is similar to the GET example. The size of the JSON data being sent will impact memory usage. For very large datasets, consider streaming the data from a file instead of loading it all into memory at once.
Alternatives
As mentioned before, `urllib3`, `aiohttp`, and `httpx` are alternatives. For asynchronous operation, `aiohttp` and `httpx` are good options.
Pros
Cons
FAQ
-
What is the purpose of the `Content-Type` header?
The `Content-Type` header specifies the format of the data being sent in the request body. It tells the server how to interpret the data. For JSON data, the `Content-Type` should be set to `application/json`. -
How do I handle errors from the server?
You should always check the HTTP status code of the response. A status code of 200 indicates success, while status codes in the 4xx and 5xx range indicate errors. Use `response.raise_for_status()` to automatically raise an exception for bad status codes, and use `try...except` blocks to handle these exceptions. -
Can I send data other than JSON in a POST request?
Yes, you can send other types of data, such as form data (`application/x-www-form-urlencoded`) or XML (`application/xml`). You will need to set the `Content-Type` header accordingly and format the data appropriately.