前回の記事では、URLを通じてデータを受け取る「パスパラメータ」と「クエリパラメータ」について解説しました。
第3回となる今回は、より複雑で構造化されたデータを扱うための「リクエストボディ」と、それを支える強力なライブラリ「Pydantic(パイダンティック)」について詳しく見ていきましょう。
リクエストボディとは?(GETからPOSTへ)
これまではURLにデータを乗せて送る方法(GETメソッド)を扱いましたが、ユーザー登録や商品の注文など、送るデータ量が多い場合や機密情報を扱う場合は、URLではなく「通信のボディ(中身)」にデータを込めて送ります。これがリクエストボディです。主にPOSTメソッドなどで利用されます。
通常、このボディにはJSON形式のデータが使われますが、プログラム側でそのJSONを手動で解析(パース)するのは非常に手間がかかります。そこで登場するのがPydanticです。
Pydantic:Pythonの「構造体」のような存在
組み込みエンジニアやC言語経験者の方なら、複数のデータをまとめて管理する「構造体(struct)」をイメージすると分かりやすいでしょう。
FastAPIはPydanticというライブラリを標準で採用しており、クラスを定義するだけで「どんなデータが来るか」を厳密に定義できます。
基本の実装例
まずは、商品情報を定義する「モデル」を作ってみましょう。
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# Pydanticモデルの定義(C言語の構造体のようなイメージ)
class Item(BaseModel):
name: str # 必須:文字列
price: float # 必須:浮動小数点
is_offer: Optional[bool] = None # 任意:真偽値(デフォルトはNone)
@app.post("/items/")
def create_item(item: Item):
# JSONが自動的にItemオブジェクトに変換されている
return {"message": f"商品「{item.name}」を登録しました", "price": item.price}自動バリデーションの威力
Pydanticの凄さは、単にデータをまとめるだけでなく、「データが正しいかを自動でチェック(バリデーション)してくれる」点にあります。
例えば、上記の price(float型)に対して文字列の "abc" を送ってみたとします。

FastAPI(Pydantic)は、即座に「priceは数値である必要があります」という詳細なエラーメッセージを返してくれます。開発者が if type(price) != float: のようなチェックコードを1行も書く必要がないのです。
Swagger UIでPOSTリクエストを試す
第1回からお伝えしている通り、FastAPIはドキュメント生成が優秀です。/docs にアクセスしてみましょう。

POSTメソッドを開くと、定義したPydanticモデルに基づいたJSONのサンプルが表示されています。 「Try it out」をクリックすると、ブラウザ上でJSONの内容を書き換えて実際に送信テストができます。フロントエンドの実装を待たずに、バックエンドのロジックを完璧に検証できるのは大きなメリットです。
組み込みエンジニアに刺さる「型」の安心感
Pythonは動的型付け言語ですが、FastAPI + Pydanticの組み合わせは、限りなく静的型付け言語に近い安心感を提供してくれます。
C言語で通信パケットの構造体を定義し、受信したバイナリをキャストして扱う感覚に近く、それでいてJSONのパースミスでセグメンテーションフォールトを起こす心配もありません。この「型によるガード」こそが、FastAPIが現代のAPI開発で選ばれる最大の理由の一つです。
まとめ:第3回はここまで
今回は、構造化されたデータを扱うための「リクエストボディ」と「Pydantic」について解説しました。
- リクエストボディ: 大容量・複雑なデータを送るための通信の中身
- Pydantic: データの「型」と「ルール」を定義するクラス
- 自動バリデーション: 型が違うデータを入り口でシャットアウトしてくれる
データの受け取り方をマスターすれば、次は「受け取ったデータをどう処理するか」です。 次回(第4回)は、いよいよデータベースとの連携について、その入り口を解説していきます。

コメント