こんにちは。 エキサイト株式会社の三浦です。
REST APIにおけるHTTPメソッドには、GETやPOST、PUTやDELETEなどが存在し、APIの各エンドポイントの役割に応じて使うようになっています。
ですが、実際に開発を行っていく上では、必ずしもHTTPメソッドを使い分けることが開発のしやすさにつながるとは限りません。
今回は、REST APIを作るとき、どのHTTPメソッドを使うのがいいかの案を紹介します。
REST APIとHTTPメソッド
RESTの設計で作ったAPI(REST API)では、APIのエンドポイントの役割ごとにHTTPメソッドを使い分けるのが普通です。
例えば、以下のような使い分けになります。
メソッド | 用途 |
---|---|
GET | データ取得 |
POST | データ作成 |
PUT | データ更新 |
DELETE | データ削除 |
たとえば、ユーザを扱うエンドポイントであれば、以下のようになるでしょう。
メソッド・パス | 処理 |
---|---|
GET https://sample.url/user | ユーザ情報を取得する |
POST https://sample.url/user | ユーザを作成する |
PUT https://sample.url/user | ユーザ情報を更新する |
DELETE https://sample.url/user | ユーザを削除する |
パスを変えることなくメソッドのみで処理を表現できるため、凝集度が高くわかりやすいという利点があります。
また、HTTPメソッドは一般的な概念であるため、新しくサービスにジョインした人にとってわかりやすいという利点もあるでしょう。
これだけ見ると特に問題は無いように思えますが、実際は課題もあります。
HTTPメソッドを理想通りに使うことの問題点
1エンドポイントで複数の処理が行われる場合がある
APIを作りたてのうちは、HTTPメソッドを理想通りに使っていても特に問題は感じないでしょう。
ただし、サービスが大きくなり、APIの仕様や処理が複雑になっていくにつれ、ある問題が出てくる可能性があります。
それは、「1エンドポイントで複数の処理が行われる場合がある」ことです。
サービスが大きくなり、連動して仕様も複雑になれば、1エンドポイントでデータの作成・更新・削除を複合的に行う必要が出てくる場合は十分に考えられます。
もしそうなった場合、どのHTTPメソッドを使えばよいのでしょうか?
現状だとどのHTTPメソッドにも当てはまらないため、難しい選択となってしまいます。
一部HTTPメソッドの使い分けがわかりにくい
これは慣れの問題もあるかもしれませんが、個人的にはPOST・PUT・PATCH(更新に使うHTTPメソッドの1つ)などの使い分けがわかりにくく感じるときがあります。
例えばGETは意味通り「取得する」ですし、DELETEは文字通り「削除する」なのでわかりやすいのですが、POST・PUT・PATCHは日本人の身としてはあまり馴染みがないため、単語だけではどれに使うかがすぐにはわからない場合があります。
もちろんREST APIを上記のHTTPメソッドの使い分けで作ることに慣れきってしまえば問題ないのでしょうが、単語だけの情報を見て一発でわからないのは少し面倒に感じる部分もあります。
HTTPメソッドの使い方案
上記の問題を解決する案として、「使用するHTTPメソッドを制限する」というものが考えられます。
つまり、以下のように使い分けるのです。
メソッド | 用途 |
---|---|
GET | データ取得 |
POST | データ取得以外 |
これだとPOSTでの処理がデータの作成・更新・削除のどれになるかがわかりませんが、それはURLのパスで区別するようにします。
メソッド・パス | 処理 |
---|---|
GET https://sample.url/user | ユーザ情報を取得する |
POST https://sample.url/user/create | ユーザを作成する |
POST https://sample.url/user/update | ユーザ情報を更新する |
POST https://sample.url/user/delete | ユーザを削除する |
このようにすることで、先程問題点にあげた「1エンドポイントで複数の処理が行われる場合」でも、自由に設定できるパス名で適切な名前をつけるようにすれば良いので、十分に表現できるはずです。
また、「一部HTTPメソッドの使い分けがわかりにくい」部分についても、上記のように「create」や「update」などのわかりやすい単語を使えるようになるので、パス名だけを見て何をするエンドポイントなのかがより理解しやすくなるのではないでしょうか。
なお、取得だけGETで、それ以外をPOSTで分けているのは、GETの場合Botなどからのアクセスがある可能性があり、それを避けるためです。
最後に
HTTPメソッドの使い分けは、もちろん必ずしも悪いわけではありません。
むしろ理想としては、「HTTPメソッドを理想的に使い分けることができるレベルの、シンプルなAPI設計をすべき」とも言えるでしょう。
ですが現実的には、サービスが大きく複雑になっていくにつれ、そのように作ることは厳しくなっていきます。
必要に応じて、理想像にこだわりすぎず、あくまで「理解しやすさ」「開発のしやすさ」を達成できるような設計を考えるのも良いのではないでしょうか。