LoginSignup
21
14

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-07

はじめに

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

ドキュメントにアクセスしてみる

シンプルな方

Screenshot from 2019-04-07 20-02-41.png

ネストした方

Screenshot from 2019-04-07 20-34-38.png

定義した、UserモデルがBodyの雛形として記載されているので、
試しに、valueを編集して実行してみましょう。

実行結果

シンプルな方

Screenshot from 2019-04-07 20-14-43.png

ネストした方

Screenshot from 2019-04-07 20-38-32.png

期待したとおりの結果が返ってきていると思います。

おわりに

モデルを定義するだけで、Swaggerの方にも反映されることに驚きました。
また、モデルにモデルを入れるような複雑なこともできるようなので、
結構柔軟にいろいろできそうです。

参考にしたサイト

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

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

21
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
14