Making HTTP requests in a FastAPI application is a common task when building web applications or APIs. This tutorial aims to provide you with the best practices for making HTTP requests using FastAPI.
Step 1: Install Requests Library
The first step in making HTTP requests in FastAPI is to install the requests
library. You can do this by running the following command in your terminal:
pip install requests
Step 2: Import Requests and FastAPI
Next, you need to import the requests
library and FastAPI in your application:
from fastapi import FastAPI
import requests
Step 3: Making GET Requests
To make a GET request in FastAPI, you can use the requests.get()
method. Here’s an example of how to make a GET request to a remote API:
@app.get("/api/data")
def get_data():
response = requests.get('https://jsonplaceholder.typicode.com/posts')
data = response.json()
return data
In the example above, we are making a GET request to the JSONPlaceholder API to retrieve a list of posts. We then return the data as a JSON response.
Step 4: Handling POST Requests
To make a POST request in FastAPI, you can use the requests.post()
method. Here’s an example of how to make a POST request to a remote API:
@app.post("/api/data")
def create_data(data: dict):
response = requests.post('https://jsonplaceholder.typicode.com/posts', json=data)
new_data = response.json()
return new_data
In the example above, we are making a POST request to the JSONPlaceholder API to create a new post. We pass the data as a JSON object in the json
parameter of the requests.post()
method.
Step 5: Error Handling
It’s important to handle errors when making HTTP requests in FastAPI. You can use the response.raise_for_status()
method to check for errors in the response:
response = requests.get('https://jsonplaceholder.typicode.com/invalid-url')
response.raise_for_status()
This will raise an exception if the HTTP status code of the response is an error (e.g., 4xx or 5xx).
Step 6: Asynchronous Requests
FastAPI supports asynchronous request handling using async/await syntax. You can use the aiohttp
library to make asynchronous HTTP requests in FastAPI. Here’s an example of how to make an asynchronous GET request:
import aiohttp
@app.get("/api/data")
async def get_data():
async with aiohttp.ClientSession() as session:
async with session.get('https://jsonplaceholder.typicode.com/posts') as response:
data = await response.json()
return data
In the example above, we use the aiohttp.ClientSession()
context manager to make an asynchronous GET request. We then use the await
keyword to wait for the response and retrieve the data.
Step 7: Testing HTTP Requests
It’s important to test your HTTP requests in FastAPI to ensure they are working correctly. You can use tools like Pytest to write unit tests for your endpoints that make HTTP requests. Here’s an example of a unit test for a GET request:
import requests
def test_get_data():
response = requests.get('http://127.0.0.1:8000/api/data')
assert response.status_code == 200
assert len(response.json()) > 0
In the example above, we use the requests
library to make a GET request to our FastAPI endpoint and assert that the status code is 200 and the response data is not empty.
In conclusion, making HTTP requests in FastAPI is a straightforward process when following these best practices. By following these steps, you can effectively make and handle HTTP requests in your FastAPI application.
I have so many questions, I am so sorry.
Should you pass app to the AsyncClient() as well for the ASGI server?
Also, how would the last example affect APIRouters defined in separate files? How would they reach app.client?
They could have their separate lifespan function but wouldn't it be prefered to use the same object?
Also, I don't know, but wouldn't it be better to use app.state.client?
Oh, and what about POST requests, would you still use the Request object to reach the client? It works, but it gets messy code wise.
got any benchmarks?
Great video, thanks for sharing
Well fastapi ( fun get ( ))
this is not about FastApi, its about sync functions and async functions so just dont use sync functions in async functions if sync one is takes a lot of time.
Great video. Short and to the point. Subscribed.
Thanks. ❤
Great knowledgable video
thx bro! so useful material, keep going
thank you!
dont we have to enable the 68 no line? "app = Fastapi(lifespan=lifespan)" ?
thank you!
Hello! Thank you for the video! Could you tell me how to measure the request (in your video it’s about 300ms)? Using a decorator? If so, I tried it, but it didn’t help, because time information is simply not displayed in the logs. I would like this information to be absorbed and for me to see a clear difference in the use of reguess and nttpx. I can’t leave a comment with a link to pastebin because youtube deletes such comments