Help us understand the problem. What is going on with this article?

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

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

http://localhost:8000/docs

シンプルな方

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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした