Sending a JSON string to FastAPI but 422 error due to pydantic model

31 Views Asked by At

I try to send this JSON string to my FastAPI API but I always get an 422.

{"data":[{"pickup_session_id":1,"product_id":3,"product_usage_type_id":0,"total":0},{"pickup_session_id":1,"product_id":3,"product_usage_type_id":25,"total":0},{"pickup_session_id":1,"product_id":3,"product_usage_type_id":50,"total":0},{"pickup_session_id":1,"product_id":3,"product_usage_type_id":75,"total":0},{"pickup_session_id":1,"product_id":3,"product_usage_type_id":100,"total":0},{"pickup_session_id":1,"product_id":8,"product_usage_type_id":0,"total":0},{"pickup_session_id":1,"product_id":8,"product_usage_type_id":25,"total":0},{"pickup_session_id":1,"product_id":8,"product_usage_type_id":50,"total":0},{"pickup_session_id":1,"product_id":8,"product_usage_type_id":75,"total":0},{"pickup_session_id":1,"product_id":8,"product_usage_type_id":100,"total":0}]}

My client side is like this:

const x = JSON.stringify(obj)
        console.log(x);
        const response = await fetch(`http://localhost:8000/pickups/`, {
            method: "POST",
            mode: "no-cors",
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            body: x
        });

The server side is as follows:

@router.post('/')
async def create_pickup(pickupSchemaList: PickupInList, session = Depends(get_session)):
#async def create_pickup(request: Request, session = Depends(get_session)):
    #print(await request.json())
    async with session() as session:
        for pickup_schema in pickupSchemaList.data: 
            print(pickup_schema)
            pickup = Pickup(
                pickup_session_id=pickup_schema.pickup_session_id,
                product_id=pickup_schema.product_id,
                product_usage_type_id=pickup_schema.product_usage_type_id,
                total=pickup_schema.total
            )
            session.add(pickup)
            await session.commit()
            await session.refresh(pickup)

and the pydantic models are:

class PickupIn(BaseModel):
    pickup_session_id: int
    product_id: int
    product_usage_type_id: int
    total: int

class PickupInList(BaseModel):
    data: list[PickupIn]

If I send the same JSON string through POSTMAN, it works, so I think it's a problem of encoding with double quotes.

UPDATE

with axios DOES WORK!!!,

        obj['data'] = d;
        const x = JSON.stringify(obj)
        console.log(x);
        axios.post(`http://localhost:8000/pickups/`, obj, {
            headers: {
                'Access-Control-Allow-Origin': '*',
                Accept: "application/json",
                "Content-Type": "application/json;charset=UTF-8",
            },

        })
        .then(({data}) => {
            alert(data);
            console.log(data);
        });

but with fetch does not:

        const response = await fetch(`http://localhost:8000/pickups/`, {
            method: "POST",
            mode: "no-cors",
            headers: {
                Accept: "application/json",
                "Content-Type": "application/json;charset=UTF-8",
            },
            body: x
        });
0

There are 0 best solutions below