最近APIのテストをする時によくPostmanを使っています。
FastAPIにバイナリデータをPOSTしようとして詰まったのでメモっておきます。
TL;DR
Postmanからバイナリを送信するときはbinaryではなくform-dataを使いましょう。
困ったこと
http://localhost:8000/pool/
でPOSTを受信するプログラムを作っていました。
...
@app.post("/pool/")
async def receiveBinary(file: UploadFile = File(...), authorization: str = Header(None)):
BearerCheck(authorization)
return {"filename": file.filename}
PostmanでPOSTのチェックをしたところ
422 Unprocessable Entity "failed required" "value_error.missing"
と怒られてしまいました。
解決
色々と調べてここを見ていたらform-dataで送信してるではありませんか。
なんとなくbinary
という項目があったので使っていましたが、考えてみれば実装時はform-dataで送りますもんね。
from-dataで改めて送信したところしっかりレスポンス200を受け取れれました。
なんとなくFastAPIが悪いと思って遠回りしてしまいました。
たぶんPostmanでbinaryを選択して送信した際にbodyヘッダを付けて送信していたからFastAPI側で受け取れなかったのではないか…と解釈しています。
https://stackoverflow.com/questions/71488533/fastapi-postman-error-422-processable-entity
https://stackoverflow.com/questions/62798421/how-to-send-file-to-fastapi-endpoint-using-postman
https://www.reddit.com/r/FastAPI/comments/pxupra/msg_field_required_type_value_errormissing_error/