📖 Scenario: You are building a simple web API that can return different types of responses depending on the request. Sometimes it returns plain text, sometimes JSON data.
🎯 Goal: Create a FastAPI app with one endpoint /response that returns either plain text or JSON depending on a query parameter.
📋 What You'll Learn
Create a FastAPI app instance called app
Add a GET endpoint /response with a query parameter type
If type is text, return plain text response
If type is json, return JSON response with a dictionary
Use correct FastAPI response types for each case
💡 Why This Matters
🌍 Real World
APIs often need to return different formats like JSON or plain text depending on client needs.
💼 Career
Knowing how to handle multiple response types is important for backend developers building flexible APIs.
Progress0 / 4 steps
1
Create FastAPI app instance
Create a FastAPI app instance called app by importing FastAPI and initializing it.
FastAPI
Hint
Use FastAPI() to create the app instance and assign it to app.
2
Add GET endpoint with query parameter
Add a GET endpoint /response to the app that accepts a query parameter called type of type str.
FastAPI
Hint
Use @app.get("/response") decorator and define an async function with type: str parameter.
3
Return plain text or JSON based on query parameter
Inside the get_response function, return plain text 'This is plain text' if type equals 'text'. Otherwise, return a JSON dictionary {"message": "This is JSON"}.
FastAPI
Hint
Use an if statement to check type and return the correct response.
4
Use correct response classes for text and JSON
Import PlainTextResponse from fastapi.responses and update the get_response function to return PlainTextResponse with the text when type is 'text'. Return the JSON dictionary directly otherwise.
FastAPI
Hint
Use PlainTextResponse to send plain text responses properly in FastAPI.
Practice
(1/5)
1. What is the main purpose of using multiple response types in a FastAPI route?
easy
A. To speed up the API response time by caching
B. To allow the API to send different response formats based on conditions
C. To restrict the API to only one response format
D. To automatically generate database schemas
Solution
Step 1: Understand response types in FastAPI
Multiple response types let an API send different formats like JSON or HTML depending on the request or logic.
Step 2: Identify the purpose
This flexibility helps clients get the response format they expect or need.
Final Answer:
To allow the API to send different response formats based on conditions -> Option B
Quick Check:
Multiple response types = different formats [OK]
Hint: Multiple response types mean flexible output formats [OK]
Common Mistakes:
Thinking it speeds up response time
Believing it restricts to one format
Confusing with database schema generation
2. Which of the following is the correct way to declare multiple response types in a FastAPI route decorator?
easy
A. @app.get('/items', responses={200: {'content': {'application/json': {}}}})
B. @app.get('/items', response_formats=['json', 'html'])
C. @app.get('/items', response_type=['json', 'html'])
D. @app.get('/items', responses={200: {'content': {'application/json': {}, 'text/html': {}}}})
C. Returning a plain string instead of a Response object for plain text
D. Function should not be async
Solution
Step 1: Check return types in the function
When response_type is not 'json', the function returns a plain string instead of a Response object.
Step 2: Understand FastAPI response requirements
FastAPI expects a Response object like PlainTextResponse for non-JSON responses to set headers correctly.
Final Answer:
Returning a plain string instead of a Response object for plain text -> Option C
Quick Check:
Plain string return needs PlainTextResponse [OK]
Hint: Return Response objects, not raw strings for non-JSON [OK]
Common Mistakes:
Returning raw strings instead of Response objects
Ignoring response content type headers
Assuming async is not needed
5. You want a FastAPI route to return JSON by default but HTML if a query parameter ?format=html is given. Which approach correctly implements this with multiple response types?
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse, HTMLResponse
app = FastAPI()
@app.get('/info', responses={200: {'content': {'application/json': {}, 'text/html': {}}}})
async def info(request: Request):
format = request.query_params.get('format')
if format == 'html':
# What to return here?
else:
return JSONResponse(content={'info': 'data'})
hard
A. return HTMLResponse(content='
Info
')
B. return {'info': '
Info
'}
C. return JSONResponse(content={'info': '
Info
'})
D. return Response(content='
Info
', media_type='application/json')
Solution
Step 1: Check the condition for HTML format
If the query parameter 'format' equals 'html', the route should return an HTML response.
Step 2: Use the correct response class for HTML
HTMLResponse sets the content type to 'text/html' and sends HTML content properly.
Final Answer:
return HTMLResponse(content='<h1>Info</h1>') -> Option A
Quick Check:
HTMLResponse for HTML output = return HTMLResponse(content='<h1>Info</h1>') [OK]
Hint: Use HTMLResponse to send HTML content explicitly [OK]
Common Mistakes:
Returning dict with HTML string instead of HTMLResponse
Using JSONResponse with HTML content type
Setting wrong media_type in Response
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.