FastAPIとは?まずはAPIの基礎から理解しよう

「FastAPIを使ってみたい!」と思っても、そもそもAPIって何?RESTって何?というところで止まってしまう人は多いです。この記事ではAPIの基礎の基礎から丁寧に解説しながら、PythonでREST APIを作る方法を一緒に学んでいきましょう。
そもそもAPIとは?
API(Application Programming Interface)とは、アプリケーション同士がやり取りするための「窓口」のようなものです。
たとえばレストランに例えると…
- お客さん(クライアント)がメニューを見て注文する
- ウェイター(API)が注文をキッチンに伝える
- キッチン(サーバー)が料理を作って返す
このウェイターの役割がAPIです。お客さんはキッチンの中がどうなっているか知らなくていい。ウェイターに「これをください」と言うだけで、料理が出てくる仕組みです。
具体的な例としては…
- 天気予報アプリが気象データサービスから天気情報を取得する
- ECサイトが決済サービス(Stripe・PayPalなど)と連携して支払い処理をする
- Googleマップを自分のサイトに埋め込む
- TwitterやInstagramのデータを外部アプリから取得する
REST APIとは?
REST(Representational State Transfer)は、Web APIを設計するためのスタイル(考え方)の一つです。RESTに従って作られたAPIを「REST API」と呼びます。
REST APIの特徴は、HTTPのメソッドを使ってデータ操作の意味を表現する点です。
| HTTPメソッド | 意味 | 例 |
|---|---|---|
| GET | データを取得する | ユーザー情報を取得 |
| POST | データを新規作成する | 新しいユーザーを登録 |
| PUT | データを更新する | ユーザー情報を更新 |
| DELETE | データを削除する | ユーザーを削除 |
URLでリソース(操作対象)を表し、HTTPメソッドで操作の種類を表す。これがRESTの基本的な考え方です。シンプルで理解しやすいため、現代のWebサービスで広く使われています。
FastAPIとは?
FastAPIは、Pythonで高速なREST APIを簡単に作れるWebフレームワークです。2018年に登場した比較的新しいフレームワークですが、その使いやすさと高いパフォーマンスから急速に人気が高まっています。
FastAPIの主な特徴はこちらです。
- 🚀 高速:NodeJSやGoと同等レベルのパフォーマンス
- ✍️ 書きやすい:Pythonの型ヒントを使ってコードがシンプル
- 📄 自動ドキュメント生成:SwaggerUIが自動で生成される
- ✅ バリデーション自動化:入力データの検証を自動でやってくれる
- 🔰 初心者にやさしい:少ないコードで動くAPIが作れる
APIを使うWebアプリとAPIなしのWebアプリの違い
ここで重要な疑問が出てきます。「APIを使わなくてもWebアプリは作れるのでは?」その通りです。では何が違うのでしょうか?
従来型のWebアプリ(APIなし)
DjangoやFlaskでHTMLを直接返す場合、サーバーがHTMLページをまるごと生成してブラウザに返します。ページを切り替えるたびにサーバーとの通信が発生し、画面全体が再読み込みされます。
【メリット】シンプルな構成で小規模サイトには向いている
【デメリット】フロントとバックが密結合になり、スマホアプリへの対応が難しい
REST APIを使ったWebアプリ
FastAPIのようなAPIサーバーを使う場合、サーバーはJSONデータだけを返します。フロントエンド(ReactやVueなど)がそのデータを受け取って画面を構築します。
【メリット】フロントとバックを完全に分離できる。Webアプリ・スマホアプリ・他サービスなど複数のクライアントから同じAPIを使い回せる
【デメリット】フロント・バックそれぞれの開発が必要で、小規模では構成が複雑になりやすい
| 比較項目 | APIなし(従来型) | REST API(FastAPI等) |
|---|---|---|
| サーバーが返すもの | HTMLページ | JSONデータ |
| フロントとバックの関係 | 密結合 | 疎結合(分離) |
| スマホアプリ対応 | 難しい | 簡単(同じAPIを使える) |
| 向いているケース | 小規模・シンプルなサイト | 大規模・マルチプラットフォーム |
FastAPIの使用例・活用シーン
「じゃあ、FastAPIって具体的にどんな場面で使うの?」というイメージを持っておくと、学習のモチベーションが上がります。代表的な活用シーンを紹介します。
- 📱 スマホアプリのバックエンド:iOSアプリやAndroidアプリがFastAPIにリクエストを送り、データを取得・保存する
- 🤖 AIモデルのAPI化:画像認識・テキスト分類などのAIモデルをAPIとして公開し、他のサービスから呼び出せるようにする
- 🏢 マイクロサービス:大きなシステムを小さなAPIに分割し、それぞれを独立して開発・デプロイする
- 🔗 外部サービスとの連携ハブ:複数の外部APIをまとめて管理・中継するゲートウェイとして使う
- 📊 データ取得・提供API:データベースのデータを外部に提供する窓口として使う
FastAPIの環境構築
それでは実際に手を動かしていきましょう!まずはFastAPIをインストールします。
# FastAPIと、サーバー用のuvicornをインストール
pip install fastapi uvicorn
uvicornはFastAPIアプリを動かすための高速なASGIサーバーです。セットでインストールしておきましょう。
はじめてのFastAPI:Hello Worldを作ろう
まずは最もシンプルなFastAPIアプリを作ってみます。main.pyというファイルを作成して、以下のコードを書いてください。
from fastapi import FastAPI
# FastAPIのインスタンスを作成
app = FastAPI()
# GETリクエストに応答するエンドポイントを定義
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
@app.get("/hello/{name}")
def say_hello(name: str):
return {"message": f"こんにちは、{name}さん!"}
次のコマンドでサーバーを起動します。
uvicorn main:app --reload
ブラウザで http://127.0.0.1:8000/ にアクセスすると、{"message": "Hello, FastAPI!"} が表示されます。http://127.0.0.1:8000/hello/太郎 にアクセスすると {"message": "こんにちは、太郎さん!"} が返ってきます。
また、http://127.0.0.1:8000/docs にアクセスすると、Swagger UIという自動生成ドキュメントが表示されます。これがFastAPIの大きな魅力の一つで、APIの仕様書が自動で作られるのです!
実践:TODOリストAPIを作ってみよう
Hello Worldの次は、より実用的なTODOリストAPIを作ってみましょう。GETとPOSTの両方を実装します。このような「タスク管理ツールのバックエンド」はFastAPIの代表的な使い方の一つです。
Pydanticでデータモデルを定義する
FastAPIではPydanticというライブラリを使って、受け取るデータの形を定義します。これにより、型の不一致などを自動でチェック(バリデーション)してくれます。
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
app = FastAPI()
# TODOアイテムのデータモデルを定義
class TodoItem(BaseModel):
title: str # タイトル(必須)
description: Optional[str] = None # 説明(任意)
done: bool = False # 完了フラグ(デフォルトはFalse)
# データを一時的に保存するリスト(本来はDBを使います)
todos: List[dict] = []
next_id: int = 1
# TODOリストを全件取得(GET)
@app.get("/todos")
def get_todos():
return todos
# TODOを1件取得(GET + IDパラメータ)
@app.get("/todos/{todo_id}")
def get_todo(todo_id: int):
for todo in todos:
if todo["id"] == todo_id:
return todo
# 見つからなければ404エラーを返す
raise HTTPException(status_code=404, detail="TODOが見つかりません")
# TODOを新規追加(POST)
@app.post("/todos")
def create_todo(item: TodoItem):
global next_id
new_todo = {
"id": next_id,
"title": item.title,
"description": item.description,
"done": item.done
}
todos.append(new_todo)
next_id += 1
return new_todo
# TODOを削除(DELETE)
@app.delete("/todos/{todo_id}")
def delete_todo(todo_id: int):
for i, todo in enumerate(todos):
if todo["id"] == todo_id:
deleted = todos.pop(i)
return {"message": "削除しました", "todo": deleted}
raise HTTPException(status_code=404, detail="TODOが見つかりません")
このコードでできることを整理すると…
GET /todos→ TODOリスト全件取得GET /todos/1→ ID=1のTODOを取得POST /todos→ 新しいTODOを追加(タイトルなどをJSONで送信)DELETE /todos/1→ ID=1のTODOを削除
たったこれだけのコードで、スマホアプリのバックエンドとして使えるTODOリストAPIが完成します。もしAPIを使わない従来型の実装なら、HTMLテンプレートの用意、フォームの処理、画面遷移の設計など、もっと多くのコードが必要になります。
実践:AIモデルをAPIとして公開する例
FastAPIが特に力を発揮するのが、AIモデルのAPI化です。たとえばテキストの感情分析モデルをAPIとして公開するケースを見てみましょう。「Pythonで作ったAIを、スマホアプリや他のサービスから使えるようにしたい」という場面で非常によく使われます。
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 入力データのモデル
class TextInput(BaseModel):
text: str
# 簡易的な感情分析(実際はtransformersなどのライブラリを使う)
def simple_sentiment(text: str) -> dict:
positive_words = ["嬉しい", "楽しい", "最高", "好き", "ありがとう"]
negative_words = ["悲しい", "つらい", "最悪", "嫌い", "困った"]
score = 0
for word in positive_words:
if word in text:
score += 1
for word in negative_words:
if word in text:
score -= 1
if score > 0:
label = "ポジティブ"
elif score < 0:
label = "ネガティブ"
else:
label = "ニュートラル"
return {"label": label, "score": score}
# 感情分析APIのエンドポイント
@app.post("/analyze")
def analyze_sentiment(input: TextInput):
result = simple_sentiment(input.text)
return {
"input_text": input.text,
"sentiment": result["label"],
"score": result["score"]
}
このAPIを公開すれば、iOSアプリ・Androidアプリ・他のPythonスクリプト・JavaScriptなど、どんなクライアントからでもPOSTリクエストを送るだけで感情分析が使えます。AIモデルの中身を知らなくていい。これがAPIの力です。
クエリパラメータとバリデーションの活用
実際のAPIでは「検索条件」などをURLに含めて渡す「クエリパラメータ」もよく使います。FastAPIではこれも非常に簡単に実装できます。
from fastapi import FastAPI, Query
from typing import Optional
app = FastAPI()
# ダミーの商品データ
products = [
{"id": 1, "name": "Pythonテキスト", "price": 2800, "category": "書籍"},
{"id": 2, "name": "Arduinoキット", "price": 3500, "category": "電子部品"},
{"id": 3, "name": "Pythonサンプル集", "price": 1980, "category": "書籍"},
{"id": 4, "name": "センサーセット", "price": 1200, "category": "電子部品"},
]
@app.get("/products")
def search_products(
category: Optional[str] = None,
min_price: Optional[int] = Query(None, ge=0), # 0以上の整数
max_price: Optional[int] = Query(None, ge=0)
):
result = products
# カテゴリフィルター
if category:
result = [p for p in result if p["category"] == category]
# 価格フィルター
if min_price is not None:
result = [p for p in result if p["price"] >= min_price]
if max_price is not None:
result = [p for p in result if p["price"] <= max_price]
return {"count": len(result), "products": result}
たとえば GET /products?category=書籍&max_price=2500 というリクエストを送ると、書籍カテゴリかつ2500円以下の商品だけが返ってきます。ge=0 の指定により、マイナスの値が来たら自動でエラーを返してくれます。バリデーションを手書きしなくてよいのはとても便利ですね。
まとめ:FastAPIで学んだポイントを整理
この記事では、APIの基礎からFastAPIの実装まで一気に学んできました。最後に重要なポイントをまとめておきましょう。
学んだことの要点整理
- ✅ APIとはアプリ同士をつなぐ「窓口」。クライアントはサーバーの内部を知らなくても使える
- ✅ REST APIとはHTTPメソッド(GET/POST/PUT/DELETE)でCRUD操作を表現するAPI設計スタイル
- ✅ FastAPIとはPythonでREST APIを高速・簡単に作れるフレームワーク。自動ドキュメント生成付き
- ✅ APIありとなしの違いAPIを使うとフロントとバックが分離でき、複数プラットフォームに対応しやすい
- ✅ Pydanticでデータモデルを定義するとバリデーションが自動化される
- ✅ 活用シーンスマホアプリのバックエンド・AI APIの公開・マイクロサービスなど
FastAPIと他フレームワークの比較
| フレームワーク | 特徴 | 向いているケース |
|---|---|---|
| FastAPI | 高速・型ヒント・自動ドキュメント | REST API・AI API・マイクロサービス |
| Flask | 軽量・シンプル・柔軟 | 小規模API・プロトタイプ |
| Django | フルスタック・機能豊富 | 大規模Webアプリ・管理画面付きサービス |
次のステップ
FastAPIの基本が掴めたら、次はこんなテーマにチャレンジしてみましょう!
- 📌 SQLAlchemyやSQLiteと組み合わせてデータベースに接続する
- 📌 JWTを使った認証・ログイン機能を実装する
- 📌 DockerでFastAPIアプリをコンテナ化してデプロイする
- 📌 Render・Railway・Fly.ioなどのクラウドサービスで公開する
FastAPIは学習コストが低く、実用的なAPIが短時間で作れるため、初心者からプロまで幅広く使われています。まずは今日紹介したサンプルコードを実際に動かして、APIを作る感覚を掴んでみてください!コードを書けば書くほど理解が深まっていきますよ。





