Python | テスト・設計・品質:REST 設計

Python Python
スポンサーリンク

REST設計って何?一言でいうと「URLとHTTPを“きれいなルール”で使う設計」

REST 設計は、Web API を作るときに、

URL
HTTPメソッド(GET / POST / PUT / PATCH / DELETE)
ステータスコード(200 / 201 / 400 / 404 など)
JSON などの表現形式

を「一貫したルール」で使うための考え方です。

ポイントは、「操作を動詞で並べる」のではなく、「リソース(もの)を名詞で表して、それに対して標準的な動詞(HTTPメソッド)を使う」という発想に切り替えることです。

「ユーザーを作るAPI」ではなく、「ユーザーというリソースに対する操作」として設計する、という感覚です。


RESTの基本:リソースを名詞で表し、HTTPメソッドで操作を表す

リソースをURLで表現する

RESTでは、「何に対する操作か」を URL で表します。
例えば、ユーザーとタスクを扱うサービスなら、こんな感じになります。

/users は「ユーザーの集合」
/users/1 は「IDが1のユーザー」
/tasks は「タスクの集合」
/tasks/10 は「IDが10のタスク」

ここでは、URLは「名詞」で終わるのが基本です。
/createUser/deleteTask のように「動詞」をURLに入れるのは、REST的にはあまり良くありません。

「何をするか」は、HTTPメソッドで表すからです。

HTTPメソッドで「何をするか」を表す

代表的なメソッドの役割はこうです。

GET
リソースを取得する(読む)

POST
新しいリソースを作る、または「集合」に対して何かを追加する

PUT
リソースを「全体として」置き換える

PATCH
リソースの一部を更新する

DELETE
リソースを削除する

例えば、ユーザーに対してはこうなります。

GET /users
ユーザー一覧を取得する

POST /users
新しいユーザーを作る

GET /users/1
IDが1のユーザーを取得する

PATCH /users/1
IDが1のユーザーの一部を更新する(名前だけ変えるなど)

DELETE /users/1
IDが1のユーザーを削除する

「URLは名詞」「メソッドは動詞」という役割分担を守ると、REST設計は一気に分かりやすくなります。


具体例でREST設計を体感する:シンプルなTodo API

エンドポイントの設計

Todo アプリの REST API を考えてみます。
扱うリソースは「タスク(todo)」です。

リソースのURLはこう決めます。

/todos
タスクの集合

/todos/{id}
特定のタスク

これに HTTPメソッドを組み合わせて、操作を設計します。

GET /todos
タスク一覧を取得

POST /todos
新しいタスクを作成

GET /todos/1
IDが1のタスクを取得

PATCH /todos/1
IDが1のタスクの一部を更新(タイトル変更、完了フラグ変更など)

DELETE /todos/1
IDが1のタスクを削除

ここまでで、「URLとメソッドの組み合わせで操作を表現する」という REST の基本が見えてきます。

リクエストとレスポンスの例

新しいタスクを作るときのリクエストは、例えばこうです。

POST /todos

{
  "title": "牛乳を買う"
}

レスポンスは、作成されたタスクを返します。

ステータスコード: 201 Created

{
  "id": 1,
  "title": "牛乳を買う",
  "done": false
}

タスク一覧を取得するときは、

GET /todos

レスポンス:

[
  {
    "id": 1,
    "title": "牛乳を買う",
    "done": false
  },
  {
    "id": 2,
    "title": "メールを送る",
    "done": true
  }
]

特定のタスクを完了にするには、

PATCH /todos/1

{
  "done": true
}

レスポンス:

{
  "id": 1,
  "title": "牛乳を買う",
  "done": true
}

このように、「リソースの形(JSON)」と「URL+メソッド」が揃っていると、API全体が直感的になります。


REST設計で特に大事なポイントを深掘りする

一貫性:同じパターンは同じルールで

REST設計で一番効いてくるのが「一貫性」です。

ユーザーもタスクも、同じパターンで設計します。

GET /usersGET /todos は「一覧を返す」
POST /usersPOST /todos は「新規作成」
GET /users/{id}GET /todos/{id} は「詳細取得」

こうしておくと、新しいリソースが増えても、クライアント側はすぐに使い方を予想できます。

逆に、

/createUser
/getAllTodos
/removeTask

のようにバラバラなルールで設計すると、
毎回ドキュメントを見ないと使い方が分からなくなります。

REST設計は、「API全体に共通のパターンを敷く」ことがとても重要です。

ステータスコードで結果を表現する

RESTでは、HTTPステータスコードも大事な「設計の一部」です。

代表的なものだけ押さえておくと十分です。

200 OK
成功(GET / PATCH / DELETE など)

201 Created
新規作成に成功(POST)

400 Bad Request
リクエストが不正(バリデーションエラーなど)

401 Unauthorized
認証が必要

403 Forbidden
権限がない

404 Not Found
リソースが存在しない

500 Internal Server Error
サーバ側の予期しないエラー

例えば、「存在しないタスクを取得しようとしたとき」は、404 Not Found を返します。

GET /todos/9999

レスポンス:

ステータスコード: 404

{
  "error": "Todo not found"
}

ステータスコードと JSON のエラーメッセージを組み合わせることで、クライアントは「何が起きたか」を正確に判断できます。

リソースの形(JSON)を安易に変えない

REST設計では、「リソースの表現(JSONの形)」も API の一部です。

例えば、さっきの Todo の JSON を、

{
  "id": 1,
  "title": "牛乳を買う",
  "done": false
}

と決めたなら、安易にキー名を変えたり、構造を変えたりしないことが大事です。

doneis_done に変える
titlename に変える

といった変更は、クライアント側のコードを壊します。

どうしても変えたいときは、バージョンを分ける(/v1/todos/v2/todos)などの工夫が必要になります。

REST設計では、「一度公開したリソースの形は、慎重に扱う」ことが品質に直結します。


Python側のコードとREST設計のつながり

FastAPIやFlaskでRESTっぽく書く

Pythonで REST API を実装するとき、FastAPI を例にするとイメージしやすいです。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class TodoIn(BaseModel):
    title: str

class TodoOut(BaseModel):
    id: int
    title: str
    done: bool

todos: list[TodoOut] = []
next_id = 1

@app.get("/todos", response_model=list[TodoOut])
def list_todos():
    return todos

@app.post("/todos", response_model=TodoOut, status_code=201)
def create_todo(todo_in: TodoIn):
    global next_id
    todo = TodoOut(id=next_id, title=todo_in.title, done=False)
    next_id += 1
    todos.append(todo)
    return todo
Python

ここでも、

URLは名詞(/todos
メソッドで操作を表現(GET / POST)
JSONの形をモデル(TodoIn, TodoOut)で定義

という REST の考え方がそのまま出てきています。

Python側の設計(ドメインモデル・ユースケース)と REST の設計を揃えると、
API全体が理解しやすく、テストもしやすくなります。


初心者がREST設計でまず意識するといいこと

URLは「名詞」、メソッドは「動詞」として使い分ける

最初の一歩としては、これだけでもかなり違います。

/getUser ではなく /users/{id} にする
/createTodo ではなく POST /todos にする

「何をするか」をURLに書くのではなく、
「何に対する操作か」をURLに書き、
「何をするか」は HTTPメソッドで表現する。

このルールを守るだけで、RESTっぽさが一気に出てきます。

同じパターンは同じ形にする

ユーザー、タスク、注文など、リソースが増えても、

一覧取得は GET /xxx
作成は POST /xxx
詳細取得は GET /xxx/{id}
更新は PATCH /xxx/{id}
削除は DELETE /xxx/{id}

というパターンを崩さないようにします。

「新しいリソースを追加するとき、既存のパターンを真似する」
これが REST設計を身につける一番の近道です。


まとめ(REST設計は「リソースとHTTPをきれいに組み合わせる設計」)

初心者目線で整理すると、REST設計はこういうものです。

リソース(ユーザー・タスクなど)を名詞のURLで表し、HTTPメソッド(GET / POST / PATCH / DELETE)で操作を表現することで、API全体に一貫したルールを敷く設計。
ステータスコードやJSONの形も「約束事」として丁寧に決めることで、クライアントから見て予測しやすく・扱いやすいAPIになり、変更にも強くなる。
最初は「URLは名詞」「メソッドは動詞」「同じパターンは同じ形」という3つだけ意識して、小さなTodo APIなどを実際に設計・実装してみると、RESTの感覚がぐっと掴みやすくなる。

タイトルとURLをコピーしました