【これを書くに至った経緯】
これまで、開発の中でHTTPメソッドはGETとPOSTしか使用しておらず、「GETはサーバーからデータを取得し、POSTはリクエストをサーバーに送信する」という認識だけで十分だと感じていました。他のHTTPメソッドの利用シーンが想像できず、GETとPOSTだけでほとんどの要件を満たせると思っていたのです。
しかし、書籍やテックブログを読むうちに、その認識が誤りであることに気づきました。HTTPメソッドにはそれぞれ明確な役割があり、使い分けることでコードの意図がはっきりし、保守性も向上します。そこで、自分の学びをアウトプットとして整理するために、この記事を書こうと思いました。
【HTTPメソッドの役割とサーバー処理への影響】
HTTPメソッドにはそれぞれ異なる役割が割り当てられており、リクエストの意図を明確に伝えるために存在しています。たとえば、POSTは新しいリソースの作成に使用され、PATCHは既存リソースの部分的な更新に使用されます。しかし、これらのメソッド自体がサーバー上のデータ処理(登録や更新)に直接影響を与えるわけではありません。実際のデータ処理は、サーバー側のプログラムやデータベース操作によって実行されます。
つまり、HTTPメソッドはサーバーでの処理内容を厳密に変えるものではなく、クライアントがサーバーに対して何をリクエストしているかという意図を伝えるための手段です。たとえば、PATCHリクエストが「部分的な更新」を意味するものの、実際にその更新処理がどのように行われるかは、サーバー側のロジックに依存します。サーバーは受け取ったリクエストに基づいて適切なデータ処理を実行します。
このように、HTTPメソッドはサーバー処理の挙動を決定するのではなく、リクエストの性質や意図を明示するための通信プロトコルにおける表現方法ということです。
【HTTPメソッドの使い分けの目的】
HTTPメソッドの使い分けは、主にリクエストの意図を明確に伝えるためにあります。サーバー処理においては、POSTやPATCH、または他のHTTPメソッド(PUT、DELETEなど)を使ってもデータ処理が可能ですが、それが正しい意図を反映しているかどうかが重要です。
たとえば、データを新規に作成する際にはPOSTを使い、部分的な更新にはPATCHを使うことによって、コードを読んだ他の開発者が一目でそのリクエストの目的を理解できるようになります。
【HTTPメソッドの挙動の違い】
HTTPメソッドは、リクエストの目的だけでなく、その挙動にも違いがあります。ここでは主要なHTTPメソッドについて、その役割と特徴を説明します。
1. GET
- 役割: サーバーから指定されたリソースのデータを取得します。
-
特徴: 副作用がなく、繰り返し実行しても結果は同じ。リクエストがサーバーに変更を加えず、何度実行しても同じ結果が得られます。
- 例: ユーザー情報を表示するためにデータを取得する操作。
2. POST
- 役割: サーバー上に新しいリソースを作成します。
-
特徴: 結果が毎回異なる可能性があり、サーバーの状態に影響を与える。リクエストを繰り返すと、新しいリソースがそのたびに作成される可能性があります。
- 例: 新規ユーザー登録のためのフォーム送信。
3. PUT
- 役割: 指定されたリソースを新規作成するか、既存のリソースを完全に置き換えます。
-
特徴: リクエストを繰り返しても結果は同じだが、サーバーのデータが変更される。同じリクエストを何度送っても、リソースが同じ状態に更新されます。
- 例: ユーザーの情報を全体的に更新する操作。
4. PATCH
- 役割: 指定されたリソースの一部を部分的に更新します。
-
特徴: 結果が異なることがあり、リクエストごとにリソースが変更される。一部のデータのみが更新され、サーバーに変更を加えます。
- 例: ユーザーのメールアドレスだけを変更する操作。
5. DELETE
- 役割: サーバー上の指定されたリソースを削除します。
-
特徴: リクエストを繰り返しても、一度削除されたリソースは再度削除されない。削除が一度成功すると、以降のリクエストはリソースが存在しない状態です。
- 例: 特定のユーザーを削除する操作。
6. HEAD
- 役割: リソースの内容ではなく、そのメタデータ(ヘッダー情報)を取得します。
-
特徴: GETメソッドに似ているが、リソース本体を返さない。繰り返し実行しても、サーバーの状態は変わりません。
- 例: リソースの存在確認やサイズを取得するリクエスト。
7. OPTIONS
- 役割: 指定されたリソースに対して、使用可能なHTTPメソッドの一覧を取得します。
-
特徴: サーバーの状態には影響を与えない。リソースに対して許可されているメソッドを確認するために使用されます。
- 例: リソースがGET、POST、PATCHなどのどのメソッドに対応しているかを確認する操作。
8. TRACE
- 役割: クライアントとサーバーの間の通信経路を追跡します。
- 特徴: 主にデバッグ用のメソッド。クライアントからサーバーに至るルートを調べ、サーバー上には変更を加えません。
9. CONNECT
- 役割: 通信トンネルを確立し、プロキシとして通信を中継します。
- 特徴: SSL/TLSなどのセキュアな通信に使用される。クライアントとサーバーの間に安全な通信路を確立します。
【適切なメソッドを選択する理由】
仮に、新規データの登録にDELETEメソッドを使用しても、技術的にはデータベースにリクエストを送信し、登録処理を実行することは可能です。しかし、DELETEは本来リソースを削除するためのメソッドであり、これをデータ登録に使用すると、他の開発者がコードを見た際に「削除の処理だ」と誤解してしまう可能性が非常に高くなります。このため、データを新規作成する際にはPOSTを使用することが推奨されます。
【まとめ】
HTTPメソッドの使い分けは、サーバー処理自体を決定するものではなく、リクエストがどのような意図で行われているのかを明確にするためのルールであり、メソッドにはそれぞれ異なるべき等性や安全性といった性質も備わっているため、これらを理解した上で適切に使い分けて今後開発に励みます。