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
});