FastAPIでPOSTされたJSONのレスポンスbodyを受け取る


はじめに

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の方にも反映されることに驚きました。
また、モデルにモデルを入れるような複雑なこともできるようなので、
結構柔軟にいろいろできそうです。

参考にしたサイト

ほぼほぼ公式を参考にしました。

https://fastapi.tiangolo.com/tutorial/body/