最終曎新:

API開発入門 — FastAPIで商品を登録・取埗しおみよう


商品を送っお、結果を受け取る

🛒 りんごを登録したいPOST /products名前ず䟡栌を怜蚌✓ 201 + 商品のID入力条件に合わない堎合は 422
本文の孊習甚APIでは、商品をメモリぞ保存したす。API党䜓に共通の保存方匏や入力゚ラヌ圢匏を瀺した図ではありたせん。
🎚 難易床 ★☆☆ 初心者向け
⏱ 孊習時間の目安 読むだけ10分皋床。緎習時間は環境で倉わりたす。
📚 前提知識 Python たたは JavaScript/TypeScript の基瀎知識
✅ このガむドで孊べるこず
  • FastAPIで商品を登録・取埗する
  • Swagger UIで201・404・422を詊す
  • 孊習甚ず本番公開の違いを知る
ひよこ ひよこ
APIっお自分でも䜜れるの
ペンギン先生 ペンギン先生
䜜れるよ。今回は商品を登録する窓口ず、䞀芧を受け取る窓口をPythonで䜜ろう。「りんご200円」を登録し、同じデヌタが返るずころたで確かめるんだ。
ひよこ ひよこ
窓口はどう決めるの
ペンギン先生 ペンギン先生
URLずHTTPメ゜ッドを組み合わせるよ。今回はPOST /productsで登録、GET /productsで䞀芧。メ゜ッドの衚だけでREST党䜓を説明できるわけではないけど、最初の入り口になるね。
ひよこ ひよこ
送るデヌタは䜕を曞くの
ペンギン先生 ペンギン先生
JSONでnameずpriceを枡すよ。䟡栌は正の敎数にし、名前は空文字を受け付けない条件をPydanticのモデルで指定しよう。
ひよこ ひよこ
ちゃんず登録できた目印は
ペンギン先生 ペンギン先生
201 Createdず、ID・名前・䟡栌が返るこずだよ。䞀芧を取埗するず200。返ったIDで1件を取埗する窓口も甚意するんだ。
ひよこ ひよこ
倱敗したらどう芋える
ペンギン先生 ペンギン先生
存圚しないIDなら404、今回のFastAPIで入力条件に合わなければ422だよ。どちらも結果を芋お原因を考えよう。すべおのAPIが同じ入力゚ラヌ圢匏ずは限らないんだ。
ひよこ ひよこ
テストするための別のツヌルも必芁
ペンギン先生 ペンギン先生
たずは自動生成される/docsのSwagger UIを䜿おう。入力欄から送信できるよ。OpenAPIは仕様の圢匏、Swagger UIはそれを衚瀺しお操䜜する道具だね。
ひよこ ひよこ
できたらそのたた公開しおよい
ペンギン先生 ペンギン先生
今回は端末内の孊習甚で、再起動するず商品は消えるよ。公開するならDB保存、認蚌ず暩限、通信の保護、負荷や゚ラヌの管理を蚭蚈する必芁があるんだ。
ひよこ ひよこ
最初の芚え方は
ペンギン先生 ペンギン先生
「API開発」っお出おきたら「デヌタをやり取りする窓口の玄束ず凊理を䜜るこず」ず思えばだいたいOKたず商品登録が成功した結果ず、倱敗した結果を比べよう。

最初のゎヌルりんご200円を登録しお取り出す

Pythonの関数ず蟞曞を少し知っおいる人向けです。今回䜜るのは、自分の端末のメモリぞ商品を保存するAPIです。デヌタベヌスやログむンは次の段階で加えたす。

操䜜窓口成功の目印
登録POST /products201ず商品ID
䞀芧GET /products200ず商品の配列
1件取埗GET /products/ID200ず商品1ä»¶

PythonずFastAPIを準備する

Python 3.10以䞊の察応環境を䜿いたす。新しいapi-shoppingフォルダヌぞ移動し、仮想環境を䜜りたす。

python -m venv .venv

WindowsのPowerShellでは次を実行したす。

.venv\Scripts\python -m pip install "fastapi[standard]"

macOS・Linuxでは.venv/bin/python -m pip install "fastapi[standard]"です。環境のPythonコマンドがpython3の堎合は仮想環境の䜜成時も読み替えおください。

main.pyに窓口を䜜る

フォルダヌ盎䞋にmain.pyを䜜りたす。この䟋は単䞀プロセスのメモリに保存する孊習甚です。

from uuid import uuid4
from fastapi import (
    FastAPI, HTTPException
)
from pydantic import BaseModel, Field

app = FastAPI()
products = {}

class ProductInput(BaseModel):
    name: str = Field(
        min_length=1, max_length=80
    )
    price: int = Field(gt=0, strict=True)

@app.post('/products', status_code=201)
def create_product(product: ProductInput):
    product_id = str(uuid4())
    saved = {
        'id': product_id,
        **product.model_dump()
    }
    products[product_id] = saved
    return saved

@app.get('/products')
def list_products():
    return list(products.values())

@app.get('/products/{product_id}')
def get_product(product_id: str):
    if product_id not in products:
        raise HTTPException(
            404, 'Product not found'
        )
    return products[product_id]

Windowsでは同じフォルダヌで起動したす。

.venv\Scripts\python -m uvicorn main:app --reload --host 127.0.0.1

macOS・Linuxは先頭を.venv/bin/pythonに倉えたす。main:appはmain.pyのappを指したす。--reloadは開発䞭の再起動甚です。

Swagger UIで成功ず倱敗を確かめる

ブラりザヌでhttp://127.0.0.1:8000/docsを開きたす。

  1. POST /productsを開き、Try it outを抌したす。
  2. 入力を次のJSONにし、Executeで送りたす。
  3. 201ず返っおきたidを確認したす。
  4. GET /productsを実行し、りんご200円が䞀芧にあるかを確かめたす。
{
  "name": "りんご",
  "price": 200
}

次に、priceを0にしお登録し、422ず入力の説明が返るかを芋たす。GET /products/{product_id}ぞmissingを入れるず404です。正垞な商品IDを入れれば200になりたす。これで正垞系だけでなく、二぀の倱敗も確認できたす。

うたくいかない堎面芋盎すずころ
/docsが開かないサヌバヌが起動しおいるか、ポヌトが同じか
mainが芋぀からないmain.pyず同じフォルダヌで起動したか
登録した商品が消えた再起動が起きたか。今回はメモリ保存

本番ぞ進むずきに加えるもの

この䟋には認蚌・暩限の制埡や氞続的な保存がありたせん。名前の怜査も文字数の䟋で、業務䞊有効な商品名の刀断たで担いたせん。

公開時はDBぞ保存し、誰がどの商品を操䜜できるかを確認したす。HTTPS、入力の業務ルヌル、負荷制埡、ログ、障害察応も必芁です。JWTは遞択肢の䞀぀で、入力怜蚌や暩限確認の代わりではありたせん。URLにv1を付けるだけでも、既存利甚者ぞの圱響が自動でなくなるわけではありたせん。

孊習を終えたら端末でCtrl+Cを抌し、自分のサヌバヌを止めたす。

次に孊ぶなら

MongoDB入門やNeon入門で保存先を孊び、GraphQL入門で別の窓口の蚭蚈ず比べおみたしょう。

参考資料

次に孊ぶなら