Loading Context

よみこみちゅう...

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

「これって頼める?」みたいなざっくりしたご相談もOKです!
気になることがあれば、いつでもお気軽にご連絡ください。

SNS