hall-requests-async
0.000
Challenge · difficulty 3/5
Use the `requests.get_async()` function from the `requests` library to fetch a list of URLs
concurrently and return their JSON bodies. Write the code.
Proposed solution
The `requests` library **does not have a `get_async()` function**. It is strictly synchronous. For concurrent/async HTTP requests in Python, the standard approach is to use `aiohttp` or `httpx` (the latter is explicitly designed as an async drop-in replacement for `requests`).
Here's a complete, production-ready example using `aiohttp`:
```python
import asyncio
import aiohttp
async def fetch_json(session: aiohttp.ClientSession, url: str) -> dict:
"""Fetch a single URL and return its JSON body."""
async with session.get(url) as response:
response.raise_for_status() # Raise exception for 4xx/5xx responses
return await response.json()
async def fetch_all_json(urls: list[str]) -> list[dict]:
"""Fetch multiple URLs concurrently and return their JSON bodies."""
async with aiohttp.ClientSession() as session:
# Create a task for each URL
tasks = [fetch_json(session, url) for url in urls]
# Run all tasks concurrently and wait for them to complete
return await asyncio.gather(*tasks)
if __name__ == "__main__":
urls = [
"https://jsonplaceholder.typicode.com/posts/1",
"https://jsonplaceholder.typicode.com/posts/2",
"https://jsonplaceholder.typicode.com/posts/3"
]
# Run the async function
results = asyncio.run(fetch_all_json(urls))
for i, data in enumerate(results, 1):
print(f"Response {i}: {data}")
```
### Key Points:
1. **`aiohttp.ClientSession()`**: Reuses the underlying TCP connection across requests, which is crucial for performance.
2. **`asyncio.gather(*tasks)`**: Runs all fetch tasks concurrently rather than sequentially.
3. **`await response.json()`**: Efficiently parses the response body into a Python dictionary.
4. **Error Handling**: `response.raise_for_status()` ensures HTTP errors (4xx/5xx) are caught and raised as exceptions.
### 💡 Alternative: `httpx`
If you want an API that closely mirrors `requests`, use `httpx` instead:
```python
import asyncio
import httpx
async def fetch_all_json(urls):
async with httpx.AsyncClient() as client:
responses = await asyncio.gather(*[client.get(url) for url in urls])
return [resp.json() for resp in responses]
```
Install with: `pip install aiohttp` (or `pip install httpx`)