diff --git a/fastapi/routing.py b/fastapi/routing.py index f620ced5f..7d5059ba9 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -4444,3 +4444,20 @@ class APIRouter(routing.Router): return func return decorator + +def get_query_param(request, name: str, default: str | None = None) -> str | None: + """ + Utility function to safely fetch a query parameter from a request. + + Args: + request: The request object. + name (str): The name of the query parameter to retrieve. + default (str | None, optional): The value to return if the parameter is missing. Defaults to None. + + Returns: + str | None: The query parameter value, or the default if not found. + """ + try: + return request.query_params.get(name, default) + except Exception: + return default diff --git a/tests/test_get_query_param.py b/tests/test_get_query_param.py new file mode 100644 index 000000000..b6287227d --- /dev/null +++ b/tests/test_get_query_param.py @@ -0,0 +1,24 @@ +import pytest +from starlette.requests import Request +from fastapi.routing import get_query_param +from starlette.testclient import TestClient +from fastapi import FastAPI + +app = FastAPI() + +@app.get("/demo") +async def demo(request: Request): + value = get_query_param(request, "name", default="guest") + return {"name": value} + +client = TestClient(app) + + +def test_existing_query_param(): + response = client.get("/demo?name=josh") + assert response.json() == {"name": "josh"} + + +def test_missing_query_param_returns_default(): + response = client.get("/demo") + assert response.json() == {"name": "guest"}