Blog

HTTPメソッドの使い分け

2024.12.13

本記事の目的


HTTPメソッドの種類、およびその使い分けについて改めて整理します。
特に、GETとPOSTが多用されている一方で、DELETEやPUTをあまり見かけない理由を調査し、今後の設計方針の参考にすることを目的としています。


HTTPってそもそもなんぞや


HTTPというのはWebサーバーにアクセスするためのプロトコル(=規約)のことです。
プロトコルは他にもファイル転送用のFTP、メール送信に用いられるSMTP等があります。
例えば、WebブラウザからURLを指定してページを開くときも、このHTTPプロトコルを使って通信をしています。
※ 現代のWeb通信ではセキュリティ強化のために、HTTPに暗号化を追加したHTTPSが広く使われています。このため、「URLを指定してページを開くとき」は通常HTTPSが使用されています。


http://j-nagano.tech/hoge.html


このURLをブラウザで開こうとすると、以下のような動きになります。



  1. ブラウザは「j-nagano.tech/hoge.htmlを取得したい」というHTTPリクエストをサーバーに送信します。

  2. Webサーバーはリクエストを処理し、hoge.htmlのデータ(HTMLファイルの内容)をレスポンスとして返します。

  3. ブラウザは受け取ったHTMLデータを解析し、画面にページを描画します。


ざっくりな流れはこんな感じですね。
もっと細かく話すとドメインからIPアドレスを解析したり、送信する時にデータをパケットに分割して。。などはちょっとこの章でお話するとボリュームが足りないので別の記事で触れさせていただきます。


ではメソッドというのは?


メソッドというのは、指定したURLに対して「何をしてほしいか」というのを記載します。


用語の補足
べき等性: 「同じリクエストを何回送信しても、サーバーの状態が変わらないこと」
安全性:「リクエストを送信した時に対象のリソースの状態が変化しないこと」


GET


GETメソッドは、サーバーからデータを取得するためのリクエストに使用されます。リクエストパラメータはURLに含まれ、クエリ文字列(例: ?key=value)として送信されます。


尚、あるデータを取得するためのGETリクエスト(例えば、GET /users/1)を複数回送信しても、サーバーの状態やデータは変わらないため、最初のリクエストと同じ結果が返されるのでべき等です。
GET /users でユーザー一覧を取得しても、その操作によってサーバー内のデータが変更されることはありません。データを読み取るだけの操作であるため、安全です。















べき等性 安全性
⚪︎ ⚪︎

POST


POSTメソッドは、サーバーにデータを送信するためのリクエストに使用されます。送信データはリクエストボディ(本文)に含まれるため、URLには表示されません。


POSTはべき等性をと安全性を持たないメソッドです。つまり、同じPOSTリクエストを何度繰り返しても、結果が変わる可能性があります。例えば、同じデータを何度もPOSTリクエストで送信すると、同じリソースが複数回作成されることになります。例えば、POST /users に同じデータでリクエストを送信すると、毎回新しいユーザーが作成される可能性があります。
また、ユーザー登録などでデータベースに新しいユーザーを追加する場合、POSTリクエストはそのデータを作成するため、安全性がないと言えます。















べき等性 安全性
× ×

HEAD


HEADメソッドは、GETメソッドに似ていますが、レスポンスボディを含まずにヘッダーだけを取得します。具体的には、リソースそのものを取得するのではなく、リソースの属性情報(メタデータ)を得るために使用されます。


DELETE


URLで指定した要素を削除する時に使います。


DELETEはべき等性を持つメソッドです。リソースを削除するリクエストを何度送っても、削除されるリソースが既に削除されている場合は、サーバーの状態は変わりません。すなわち、何度リクエストを送っても、結果は同じ(削除されている)状態になります。
ただ、DELETEはリソースを削除するため、サーバーのデータや状態に影響を与えるので安全性は持っておりません。















べき等性 安全性
⚪︎ ×

PUT


PUTメソッドは、指定したリソースを作成または更新するためのHTTPメソッドです。
サーバー上の指定された場所にリソースを保存し、そのリソースがすでに存在する場合は上書きします。


PUTメソッドはべき等性を持つメソッドです。つまり、同じPUTリクエストを何度繰り返しても結果は変わりません。リソースの状態が完全に一致するように置き換えられるため、同じ内容を何度送っても結果は同じです。
PUT /users/1 に同じ内容でリクエストを送信すると、ユーザー1の情報は常に同じ状態に更新されます。たとえ何度リクエストを送っても、結果に違いはありません。
ただ、PUTメソッドは安全でないメソッドです。PUTメソッドはリソースを完全に置き換えるため、サーバーの状態に影響を与える操作です。GETやHEADとは違って、PUTはサーバーの状態を変更します。















べき等性 安全性
⚪︎ ×

他にもたくさんあるようです


利用したことはありませんが、他にもTRACE、PATCH、CONNECT等色々あるようです。


GETやPOSTを扱うのが一般的?


HTTPメソッドの中でも、特にGETとPOSTが多く使用されています。以下に、その主な理由を挙げてみますが、一部は私個人の見解も含まれています。


GETとPOSTが基本的な要件を満たしている



  • GET

    • データを取得するためのリクエスト。URLにパラメータを付けるだけで簡単にデータを取得可能。



  • POST

    • データの作成や送信に利用。リクエストボディを通じてデータを送信。




これらの2つのメソッドだけで、多くのウェブアプリケーションは基本的な機能は実現可能です。


PUTやDELETEなどのサポートの問題


標準的なHTMLフォームでは、GETとPOSTしか指定できないため、ウェブアプリケーションの設計がそれに依存してきた歴史があります。
また、過去のプロキシでは、GETやPOST以外のメソッドが完全にサポートされていない場合があったそうです。(現代でもあるんでしょうか?)


開発コストや実装の簡略化


GETとPOSTに絞ることで、フロントエンドやバックエンドでの実装が単純化されます。GETやPOST以外のメソッドを導入すると、追加のルールや検証が必要になり、さらには学習コストの観点から妥協されるケースも。。


終わり


GETとPOSTが多用される理由は、実用性の高さと互換性の広さにあると解釈しました。他のメソッドも重要な役割を果たしますが、開発や運用のコスト、またはシステムの簡易さを考えると、GETとPOSTだけで事足りる場合が多いというのが現実でしょう。


とはいえ、RESTに対して理解を深めることができれば、べき等性などの特性を活かす場面が増えてきます。例えば、PUTやDELETEメソッドは、状態の変更や削除を明確に扱うため、より直感的で安全にリソースを操作できる点が魅力的です。PUTはべき等性を持ち、同じリクエストを何度繰り返してもサーバーの状態に変化を与えません。この特性を活用すれば、リトライ処理やエラー時の冗長性に対する不安も軽減されるのではないでしょうか?


これらのメソッドを使うことによってよりRESTfulに近い設計になり、メンテナンスもしやすくなるのではとも思っています。
今後API設計を行う際は、プロジェクトの特性を考えながら、これらのメリットも頭に入れつつ設計していけたらと思います:)


それでは、ここまでお付き合いいただきありがとうございました!


CONTACT

あくまでも本業がメインですが、休日や業務の隙間時間は個人でも動いております。
もしお手伝いできることがあれば、お気軽にお問い合わせください。

SNS