GET, POST, PUT, DELETEの4つのHTTPメソッドを理解する

例えば、HTMLでフォームを作る際に、getpostなどを指定するはずです。これらはHTTPメソッドと言い、種類によって明確な役割があります。

用語

どのメソッドでどのようなことが保証されているか、というのが決まっています。それらを知るために、まずは重要な用語を2つ理解しましょう。

安全性

安全性とは、そのメソッドで実行することでリソースの状態が変化しないことを示す性質です。例えば、index.htmlを取得するという操作では、何度取得を繰り返しても、その操作が理由でindex.htmlのデータが変化することはありません。

逆に安全性が無いものとは、例えばユーザ名を更新する、ファイルをアップロードする、などです。これはサーバ側でリソースが変化しています。

ただし、内部でログを取得する、統計を取るなどでのデータの変化は通常は考慮しません。

冪等性 (べきとうせい)

冪等性とは、同じ命令を何度繰り返しても同じ結果になるという性質のことです。また、安全性があるものは冪等性もあります。

冪等性がある例

例えば、idが5のデータの本文をhogehogeに更新する、という命令を考えてみます。

最初の本文がaabbccだったとすると、その命令によってhogehogeに変わります。しかし、その状態から何度hogehogeに変えるという命令を出しても、本文はhogehogeであり、同じ結果です。つまり冪等です。

冪等性の例

冪等性が無い例

例えば、本文がhogehogeというデータを追加する、という命令を考えてみます。

この命令によって、データベースなどにはhogehogeという本文のデータが追加されます。同じ命令を出すと、更にデータが追加されます。つまり、命令するごとにデータが増えるという変化が起きます。これは冪等ではありません。

それぞれのHTTPメソッドの役割

HTTPメソッドには、次の9種類があります。

  • GET
  • POST
  • PUT
  • PATCH
  • DELETE
  • OPTIONS
  • HEAD
  • TRACE
  • CONNECT

それぞれのメソッドはどの場面で使用するのか見ていきましょう。

GETメソッド

GETは、データを取得するために使用するメソッドです。データが変更されないため、安全性と冪等性があります。

GETでは、HTML情報を取得する、画像を取得する、ファイルを取得する、検索結果をJSONで取得する、といった取得する操作に使用します。

取得するだけなので、データのキャッシュが可能です。

GETメソッドでは、検索などでフォームに値を入れて送信した場合、通常はURL中にクエリストリングという形でデータが送信されます。

時々勘違いがありますが、URLのホスト自体は平文ですが、それ以外は暗号化されます。

POSTメソッド

POSTでは、ユーザがサーバにデータを送信し、何かリソースを追加したり更新したりするためのメソッドです。冪等性はありません。

例えばファイルをアップロードしてクラウドストレージに保存する、動画をアップロードするといった操作は、それをする度にデータが追加されたりするため、冪等ではありません。

ただ、ユーザ情報を特定の値に更新するなど、冪等な操作でもPOSTを使用することに問題はありません。PUTのほうが適していますが、POSTではダメというわけではありません。ただ少し不親切なだけという程度です。

POSTメソッドでは、フォームに値を入れて送信した場合、通常はリクエストボディという形で送信され、URLには含まれません。

PUTメソッド

POSTと似ていますが、PUTには冪等性があります。つまり、何度同じ操作をしても結果が同じになるようなものにPUTを用います。

しばしば、何らかのリソースを特定の状態にする、といった操作に用います。特定の状態にするというのは、何度それを実行しても同じ状態になるためです。

ここで、PUTではリソースの全体を送信します。つまり、元あるデータが

{
    "title": "sample title",
    "content": "foobarbaz hoge fuga",
    "author": "sample tarou"
}

というリソースがサーバにあったとして、

{
    "title": "new title"
}

というデータを送信すると、サーバに保存されるリソースは

{
    "title": "new title"
}

となり、contentなどは消えます。リソース全体を送信し、全体をその値で更新するというわけです。

PATCHメソッド

PATCHPOSTPUTと似ていますが、PATCHはリソースを修正するためのものです。ユーザはリソースをどのように修正するかを記述して送信し、サーバではそれを見て処理します。

修正なので冪等であることが多いですが、PUTと違い冪等である必要性はありません。正直、悩んだらPOSTで良いです。

PATCHでは部分的に変更内容を送信するため、例えばサーバにあるリソースが

{
    "title": "sample title",
    "content": "foobarbaz hoge fuga",
    "author": "sample tarou"
}

だったとして、

{
    "title": "new title"
}

というデータを送信すると、サーバに保存されるリソースは

{
    "title": "new title",
    "content": "foobarbaz hoge fuga",
    "author": "sample tarou"
}

になります。PUTではリソース全体を置き換えましたが、PATCHでは部分的な更新を行います。

DELETEメソッド

DELETEは特定のリソースを削除するためのメソッドです。

注意すべき点は、冪等性があるということです。そのため、サーバ側で最新のデータを判定して削除するという操作にDELETEメソッドは用いるべきではありません。実行する度にリソースが減るため、冪等とはならないためです。これはサーバ側の実装の話であるため、クライアント側で最新データを判別し、サーバ側ではデータのIDを受け取って削除するという命令ではDELETEメソッドを使用できます。特定のIDのデータは、”最新のデータ”という状態によって変化するものではなく、いつどのタイミングでも同じデータを指すためです。

そのため、特定のIDを持つデータを削除する、特定の日付の範囲のデータを削除するといった、何度削除命令を出しても同じ状態になるように実装しなければなりません。

そうではない場合、POSTを使用するべきです。

OPTIONSメソッド

通信オプションを記述するために使用するものです。しばしばCORSのプリフライトリクエストで使用されます。

HEADメソッド

HEADでは、GETメソッドでリクエストしたときに返されるヘッダー情報を取得するメソッドです。

HEADメソッドはヘッダーを取得するためのものであるため、レスポンスに本文は入れません。

TRACEメソッド

Webサーバに送信した内容をそのまま返すメソッドです。XST(Cross Site Tracing)という、入力データをそのまま返す性質を使って悪意を持ったスクリプトがその情報を取得する攻撃に利用されるため、通常は無効化しておくべきです。

CONNECTメソッド

トンネリングを開始する際に使用するメソッドです。これはプロキシ通信をするのに必要です。

まとめ

通常のWebサービスを作るのに知っておくべきメソッドは、GETPOSTPUTDELETEの4種類です。この4つの違いをしっかり抑えて、適切なメソッドを選択できると、良いAPI設計をしやすくなるのではないでしょうか。

httpmethod thumb

役に立ったらシェアしよう!