はじめに
FastAPIはPOSTやPUTで簡単にクエリを受け取ることができるのですが、
Bodyを受け取るとき、どうやってやるんだろうと疑問に思ったので、
メモとして残したいと思います。
やりたいこと
連想配列のような、シンプルなBodyはもちろん、
一気にデータをMySQLに流したいときなど、
配列に連想配列が入っているようなBodyをよく扱うので
今回は、この2つをPOSTで受け取ることを目標にします。
- シンプルなJSONデータ
{
"user_id": 1,
"name": "太郎"
}
- ネストされたJSONデータ
[
{
"user_id": 1,
"name": "太郎"
},
{
"user_id": 2,
"name": "次郎"
}
]
実装
main.py
from fastapi import FastAPI
from pydantic import BaseModel # リクエストbodyを定義するために必要
from typing import List # ネストされたBodyを定義するために必要
app = FastAPI()
# リクエストbodyを定義
class User(BaseModel):
user_id: int
name: str
# シンプルなJSON Bodyの受け取り
@app.post("/user/")
# 上で定義したUserモデルのリクエストbodyをuserで受け取る
# user = {"user_id": 1, "name": "太郎"}
def create_user(user: User):
# レスポンスbody
return {"res": "ok", "ID": user.user_id, "名前": user.name}
# ネストされたJSON Bodyの受け取り
@app.post("/users/")
# 上で定義したUserモデルのリクエストbodyをリストに入れた形で受け取る
# users = [{"user_id": 1, "name": "太郎"},{"user_id": 2, "name": "次郎"}]
def create_users(users: List[User]):
new_users = []
for user in users:
new_users.append({"res": "ok", "ID": user.user_id, "名前": user.name})
# 整形したデータをレスポンスbodyを送信
return new_users
実行
$ uvicorn main:app
ドキュメントにアクセスしてみる
シンプルな方
ネストした方
定義した、UserモデルがBodyの雛形として記載されているので、
試しに、valueを編集して実行してみましょう。
実行結果
シンプルな方
ネストした方
期待したとおりの結果が返ってきていると思います。
おわりに
モデルを定義するだけで、Swaggerの方にも反映されることに驚きました。
また、モデルにモデルを入れるような複雑なこともできるようなので、
結構柔軟にいろいろできそうです。
参考にしたサイト
ほぼほぼ公式を参考にしました。