HTTPメソッドをどう使い分けるか.問題を解いて理解する
はじめに
こんにちは.
本記事では『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