## What
REST は規格ではなく**書き方の流儀**。
> **URL は資源(名詞)だけを書き、何をするか(動詞)は HTTP メソッドで表す。**
## なぜ動詞を URL に書かないのか
**① 学習コストが毎回リセットされる。**
動詞の名前は API ごとに自由なので、同じ削除でも A社は `POST /deleteUser`、B社は `GET /user/remove?id=42` になる。他社で身につけた感覚が使い回せない。
**② 「GET は安全」という HTTP の約束が壊れる。**
HTTP は「GET は何度呼んでもデータを壊さない」前提で動いている。`GET /deleteUser?id=42` を作ると、**先読みされただけでデータが消える**。
## How:棚と1冊で意味が変わる
| メソッド | `/users`(棚) | `/users/42`(1冊) |
| ----------- | ---------------------------------------------- | ------------------------------------------ |
| GET | 一覧を取得 | その1件を取得 |
| POST | 新しく1件つくる(→ `201 Created`) | 使わない(id がまだ無い) |
| PUT / PATCH | 使わない(棚ごと総入れ替えは危険) | その1件を更新(PUT=丸ごと / PATCH=一部) |
| DELETE | 使わない(全消しは事故) | その1件を削除(→ `204 No Content`) |
**パスは「誰に対して」、メソッドは「何をしろ」。セットで読む。**
## How:エンドポイントを分解して読む
```
GET /repos/{owner}/{repo}/issues?state=open&per_page=30
```
- **メソッド**(`GET`)=どうする
- **パスパラメータ**(`{owner}` `{repo}`)=**どの資源の話か**。変えると別のモノを指す
- **サブ資源**(`/issues`)=資源の中の資源。左から入れ子で読む
- **クエリパラメータ**(`?` 以降)=**どう見せてほしいか**。指すモノは同じ、見せ方が変わるだけ
ただし**この流儀を守っていない API も普通にある**(`POST /api/v2/item.search` のような形)。
## 関連
- [[API]] — API まわりの地図
- [[HTTPリクエストの構造]] — 4点セット。この章の土台