Skip to content

having problems with dict used in get requests #10404

Open
@HamzaYslmn

Description

@HamzaYslmn

Q&A (please complete the following information)

  • OS: Windows 11
  • Browser: Chrome
  • Version: 134.0.6998.179
  • Method of installation: pip with fastapi
  • Swagger-UI version: 3.10.0
  • Swagger/OpenAPI version: OAS 3.1

Describe the bug you're encountering

having problems with dicts used in get requests

To reproduce...

Steps to reproduce the behavior:
write pydantic + fastapi code

import json
from typing import Optional, List
from fastapi import FastAPI, APIRouter, Query, Request, Response
from fastapi.responses import JSONResponse
from pydantic import BaseModel, Field
from pydantic import ConfigDict, field_validator

app = FastAPI()

class AdBase(BaseModel):
    id: str
    title: str
    owner: Optional[str] = None
    doc_id: Optional[List[str]] = None

class AdGetRequest(AdBase):
    page: int = Field(0, gt=-1)
    filters: Optional[dict] = Field(
        default=None,
        example={"location": ["Ankara", "İstanbul"], "position_title": "Yazılım"}
    )
    owner: Optional[str] = Field(None)
    doc_id: Optional[List[str]] = Field(None)
    
    model_config = ConfigDict(extra="ignore")
    
    @field_validator("filters", mode="before")
    def parse_filters(cls, value):
        if value is None:
            return value
        if isinstance(value, str):
            try:
                return json.loads(value)
            except json.JSONDecodeError:
                raise ValueError("filters must be a valid JSON string representing a dictionary")
        return value

@app.get("/management")
async def get_ads(request: Request, ad: AdGetRequest = Query(...)):
    print(f"Received Filters: {ad.filters}")
    
    return JSONResponse(content={"message": "Filters received","filters": ad.filters})

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

Expected behavior

url should be:
localhost:8002/DB/ad/management?page=0&filters={"location": ["Ankara", "İstanbul"], "position_title": "Yazılım"}

not:
localhost:8002/DB/ad/management?page=0&location=["Ankara","İstanbul"]&position_title=Yazılım

filters missing.

Screenshots

Image

Image

The request is wrong, it's not usable.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions