Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FastApi Post Request With Bytes Object Got 422 Error

I am writing a python post request with a bytes body:

with open('srt_file.srt', 'rb') as f:
    data = f.read()

    res = requests.post(url='http://localhost:8000/api/parse/srt',
                        data=data,
                        headers={'Content-Type': 'application/octet-stream'})

And in the server part, I tried to parse the body:

app = FastAPI()
BaseConfig.arbitrary_types_allowed = True


class Data(BaseModel):
    data: bytes

@app.post("/api/parse/{format}", response_model=CaptionJson)
async def parse_input(format: str, data: Data) -> CaptionJson:
    ...

However, I got the 422 error: {"detail":[{"loc":["body"],"msg":"value is not a valid dict","type":"type_error.dict"}]}

So where is wrong with my code, and how should I fix it? Thank you all in advance for helping out!!

like image 663
astersss92 Avatar asked Jul 20 '26 09:07

astersss92


1 Answers

FastAPI by default will expect you to pass json which will parse into a dict. It can't do that if it's isn't json, which is why you get the error you see.

You can use the Request object instead to receive arbitrary bytes from the POST body.

from fastapi import FastAPI, Request

app = FastAPI()

@app.get("/foo")
async def parse_input(request: Request):
    data: bytes = await request.body()
    # Do something with data

You might consider using Depends which will allow you to clean up your route function. FastAPI will first call your dependency function (parse_body in this example) and will inject that as an argument into your route function.

from fastapi import FastAPI, Request, Depends

app = FastAPI()

async def parse_body(request: Request):
    data: bytes = await request.body()
    return data


@app.get("/foo")
async def parse_input(data: bytes = Depends(parse_body)):
    # Do something with data
    pass
like image 122
Ben Avatar answered Jul 22 '26 23:07

Ben



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!