aiohttp
is an open-source library that provides an asynchronous HTTP client and server. It is based on the asyncio
module and supports both HTTP/1.1 and HTTP/2 protocols. This easy-to-understand article will walk you through the steps to use aiohttp
and the async/await
syntax to efficiently send GET requests in Python.
Making GET requests with aiohttp
Below are the steps:
1. aiohttp
is not built-in, so you need to install it first:
pip install aiohttp
2. Next, you need to import the aiohttp
and asyncio
modules in your Python script. These modules provide the functionality for creating an asynchronous HTTP client and running it in an event loop:
import aiohttp
import asyncio
3. In this step, you need to define an async function that will contain the logic for making the GET request. This function will use the async with
statement to create and manage a session
object, which represents a connection to the server:
async def main(url):
async with aiohttp.ClientSession() as session:
# we'll make GET request here
pass
4. Inside the async with
block, you need to use the session.get()
method to send a GET request to a URL of your choice. This method returns a response
object, which you can also access with the async with
statement. In this example, we’ll use the following API endpoint for practice:
https://api.slingacademy.com
Here’s the code:
import aiohttp
import asyncio
url = "https://api.slingacademy.com"
async def main(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
# do something with the response here
pass
5. Inside the second async with
block, you can use various attributes and methods of the response
object to access the data returned by the server. For example, you can use response.status
to get the status code, response.headers
to get the headers, response.text()
to get the text content, response.json()
to get the JSON content, etc. You need to use the await
keyword before calling these methods, as they are also asynchronous.
For instance, you can update the main()
function like this:
async def main(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
print(f"Status: {response.status}")
print(f"Content-type: {response.headers['content-type']}")
print(f"Data: {await response.json()}")
pass
You’ll still see nothing happens because we haven’t executed the main()
function yet. Let’s do this in the final step below.
6. You need to create an event loop object and run your async function in it. This will execute your code asynchronously and handle any errors or exceptions that may occur. The simplest way is to call asyncio.run()
:
# Run the main function
asyncio.run(main(url))
Complete code:
# SlingAcademy.com
# This code uses Python 3.11.4
import aiohttp
import asyncio
url = "https://api.slingacademy.com/"
async def main(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
print(f"Status: {response.status}")
print(f"Content-type: {response.headers['content-type']}")
print(f"Data: {await response.json()}")
pass
# Run the main function
asyncio.run(main(url))
Output:
Status: 200
Content-type: application/json
Data: {'success': True, 'message': 'Welcome to Sling Academy Public API'}
Setting params and headers
In order to set params and headers when sending GET requests with aiohttp
, you can pass them as arguments to the session.get()
method. For instance, if you want to send a GET request to this URL:
https://api.slingacademy.com/v1/sample-data/users
with the params offset=5
and limit=3
and the header Content-type: application/json
, you can do as shown below:
# SlingAcademy.com
# This code uses Python 3.11.4
import aiohttp
import asyncio
api_url = "https://api.slingacademy.com/v1/sample-data/users"
async def main():
async with aiohttp.ClientSession() as session:
params = {"offset": 5, "limit": 3}
headers = {"Content-type": "application/json"}
async with session.get(api_url, params=params, headers=headers) as response:
print(f"Status: {response.status}")
print(f"Data: {await response.json()}")
pass
asyncio.run(main())
Output:
Status: 200
Data: {'success': True, 'time': '2023-08-16 00:22:18 UTC', 'message': 'Sample data for testing and learning purposes', 'total_users': 1000, 'offset': 5, 'limit': 3, 'users': [{'gender': 'male', 'id': 6, 'date_of_birth': '1902-08-06T00:00:00', 'job': 'Financial manager', 'city': 'Amymouth', 'zipcode': '52484', 'latitude': -78.303175, 'profile_picture': 'https://api.slingacademy.com/public/sample-users/6.png', 'first_name': 'Joshua', 'last_name': 'Delgado', 'email': '[email protected]', 'phone': '216-424-8988x0838', 'street': '1663 Simmons Points', 'state': 'Colorado', 'country': 'Angola', 'longitude': -141.625538}, {'gender': 'male', 'id': 7, 'date_of_birth': '1911-01-21T00:00:00', 'job': 'Child psychotherapist', 'city': 'New Valerieton', 'zipcode': '84185', 'latitude': -71.2706315, 'profile_picture': 'https://api.slingacademy.com/public/sample-users/7.png', 'first_name': 'Kyle', 'last_name': 'Brown', 'email': '[email protected]', 'phone': '+1-602-863-6880x1291', 'street': '203 Taylor Place Apt. 725', 'state': 'West Virginia', 'country': 'Burundi', 'longitude': -11.632148}, {'gender': 'female', 'id': 8, 'date_of_birth': '1952-09-23T00:00:00', 'job': 'Aeronautical engineer', 'city': 'Dustinstad', 'zipcode': '45577', 'latitude': 63.089701, 'profile_picture': 'https://api.slingacademy.com/public/sample-users/8.png', 'first_name': 'Janice', 'last_name': 'Ramirez', 'email': '[email protected]', 'phone': '001-353-958-2737x873', 'street': '02762 Thomas Viaduct', 'state': 'South Carolina', 'country': 'Burkina Faso', 'longitude': -84.763775}]}
You can find more details about the API used in the example above on this page: Sample Users – Free Fake API for Practicing & Prototyping.