HTTPメソッドをどう使い分けるか.問題を解いて理解する

2024/10/22に公開

はじめに

こんにちは.
本記事では『Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESSプラスシリーズ)』を読んで感動した「HTTPメソッドをどう使い分けるか?」について詳しく掘り下げる記事です.
記事の最後には問題を6問用意しました.
是非解いてみてください.

対象読者

各HTTPメソッドの役割は理解したが,
サーバを設計する際に,HTTPメソッドをなんとなく選んでいる.
選択の基準が言語化できていない人向けの記事になっています.

8種類のHTTPメソッド

以下は8種類のHTTPメソッドの大まかな役割です.
この記事は「*」がついているメソッドは最低限知っている前提で進みます.

HTTPメソッド 役割
GET* リソースの取得
POST* リソースの作成または更新
PUT* リソースの完全な置換
DELETE* リソースの削除
HEAD リソースのヘッダ情報の取得
OPTIONS サーバーのサポートするHTTPメソッドの取得
PATCH リソースの部分的な更新
TRACE サーバーへのリクエストメッセージのループバックテスト

冪等性と安全性を理解する

先にも書いた様に,この記事の目的は「HTTPメソッドをどう使い分けるか?」を言語化できるようになることです.
そこで重要な概念,「冪等性」「安全性」 を理解する必要があります.

冪等性(べきとうせい)...ある操作を一回行っても,複数回行っても結果が同じである性質

例1)ある数,例えば3に対して0をかけることは冪等である.と言えます.
3 X 0 = 3 X 0 X 0 = 0

例2)絶対値の取得は冪等な操作です.すなわち、|x| の絶対値を取る操作を何度繰り返しても、結果は変わりません.

∣∣x∣∣=∣x∣

安全性...操作対象のリソースの状態を変化させない性質

リソース...HTML形式のファイルや画像,データベース内のデータなどのこと

例)ネタバレですが,GETメソッドには安全性が保証されます.
同じURIに対して何度GETメソッドを送っても,リソースの状態を変化させることはできません.

冪等性と安全性でメソッドを使い分ける

メソッドを使い分ける時に最も重要なことは,
「定められら安全性と冪等性を守った形でメソッドを使う」 ことです.
以下はRFCによって定められた各メソッドの安全性と冪等性を示した表です.

HTTPメソッド 安全性 冪等性
GET
HEAD
POST × ×
PUT ×
DELETE ×
PATCH × ×
OPTIONS
TRACE

改めて大切なことは
「上記表に合わせてメソッドを使う」 です.
実際に問題形式で使い方を見ていきましょう.

問題

Q1: GETメソッドを使用して、サーバーに新しいユーザー情報を送信しようとするのはなぜ誤りですか?

答え: GETメソッドは安全なメソッドであり、サーバーの状態を変更せずにリソースを取得するために使用されます.新しいユーザー情報を送信するという行為はサーバーの状態を変更するため、GETメソッドの使用は誤りです.

Q2: POSTメソッドを使用して、既存のリソースを更新しようとするのはなぜ誤りですか?

答え: 例えば,Twitterでユーザプロフィールを変更する操作を思い浮かべてください.
このときフォームに同じ文言を入力したら,毎回同じプロフィールになるので冪等性が成立しています.
よって,冪等性を持つPUTまたはPATCHメソッドを使用するべきです.

Q3: DELETEメソッドを使用して、リソースの一部分だけを削除しようとするのはなぜ誤りですか?

答え: DELETEメソッドはリソース全体の削除に使用されるべきであり,リソースの一部分だけを削除することは冪等性の原則に反します.

Q4: PUTメソッドを使用して、フォームの入力をサーバーに送信しようとするのはなぜ誤りですか?

答え: 問題文の操作として,Twitterでポストを投稿する操作を想像してください.
同じ内容で2回投稿する時,タイムラインに同じ内容の投稿が2回表示されるべきです.
また1回投稿するときは1回表示されるべきです.
すなわち繰り返し同じ処理をすると結果が異なるので,問題文の操作は冪等性を許さないメソッドを使うべきです.
よってPOSTメソッドを使うべきです.

Q5: PATCHメソッドを使用して、新しいリソースを作成しようとするのはなぜ誤りですか?

答え: PATCHメソッドは既存のリソースの部分的な更新に使用されるべきであり、新しいリソースの作成には適していません.新しいリソースを作成する場合はPOSTメソッドを使用するべきです.

Q6: GETメソッドを使用して、サーバーの設定を変更しようとするのはなぜ誤りですか?

答え: GETメソッドは安全なメソッドであり、サーバーの状態を変更せずにリソースを取得するために使用されます.サーバーの設定を変更するという行為はサーバーの状態を変更するため,GETメソッドの使用は誤りです.このような場合はPOST,PUT,またはPATCHメソッドを使用するべきです.

終わりに

記事を最後まで読んでくださいありがとうございました.
記事の誤りや,typoを発見したら,ぜひコメントください!

なお,本記事は『Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESSプラスシリーズ)』 を読んだアウトプットとして作成しました.
ぜひ,チェックしてみてください.

Discussion