HTTPメソッドの種類とは?GET・POST・PUT・PATCH・DELETEの違いを解説!

Web APIについて調べていると、GET、POST、PUT、PATCH、DELETEといった言葉を目にすることがあります。

例えば、ユーザー情報を取得するAPIではGET、新しいユーザーを登録するAPIではPOSTが使われるなど、APIで「何をしたいのか」によって使用するHTTPメソッドが異なります。

しかし、HTTPメソッドにはさまざまな種類があり、それぞれ役割が異なるため、Web APIを学び始めたばかりの場合は、次のような疑問を持つこともあるでしょう。

  • GETやPOSTとは何なのか
  • PUTとPATCHは何が違うのか
  • データを更新するときはどれを使えばよいのか
  • GETやPOST以外には何があるのか

この記事では、Web APIでよく使用するGET、POST、PUT、PATCH、DELETEを中心に、HTTPメソッドの意味や使い分けについて初心者向けにわかりやすく解説します。

HTTPメソッドとは?

HTTPメソッドとは?

HTTPメソッドとは、クライアントからサーバーへHTTPリクエストを送るときに、「どのような操作をしたいのか」を示すものです。

例えば、Web APIでは次のように使用できます。

HTTPメソッド主な用途例
GETデータを取得するユーザー情報を取得する
POSTデータを送信・作成する新しいユーザーを登録する
PUT指定したリソースをリクエストの内容で置き換えるユーザー情報全体を更新する
PATCHリソースの一部を変更するユーザー名だけを変更する
DELETEデータを削除するユーザーを削除する
HEAD本文を取得せずヘッダーを取得するファイルサイズなどを確認する
OPTIONS通信可能な方法などを確認する利用可能なHTTPメソッドなどを確認する
CONNECTサーバーとのトンネルを確立するHTTPプロキシなどで使用する
TRACE通信経路を診断するリクエストのループバックテストを行う

一般的なWeb APIを利用・開発する場合は、まずGET、POST、PUT、PATCH、DELETEの5つを理解するとよいでしょう。

HTTPメソッドとWeb APIの関係

Web APIでは、URLだけでなくHTTPメソッドを組み合わせることで、サーバーに実行してほしい処理を表現できます。

例えば、ユーザーを扱う次のURLがあるとします。

https://example.com/api/users/1

同じURLでも、HTTPメソッドによって処理の意味を変えることができます。

GET    /api/users/1
PUT    /api/users/1
PATCH  /api/users/1
DELETE /api/users/1

例えば、GET /api/users/1なら「IDが1のユーザーを取得する」、DELETE /api/users/1なら「IDが1のユーザーを削除する」といった意味になります。

簡単にいうと、URLで「何を対象にするのか」を指定し、HTTPメソッドで「その対象に何をするのか」を表現すると考えると分かりやすいでしょう。

GETとは?

GETは、主にサーバーからデータを取得するときに使用するHTTPメソッドです。

例えば、IDが1のユーザー情報を取得する場合は、次のようなリクエストを送ります。

GET /api/users/1

サーバーからは、例えば次のようなJSONデータが返されます。

{
  "id": 1,
  "name": "Taro",
  "email": "taro@example.com"
}

GETは基本的にデータを取得するためのメソッドであり、サーバー上の対象リソースを変更する目的では使用しません。

複数のデータを取得する

すべてのユーザーを取得する場合は、例えば次のようにします。

GET /api/users

一方、特定のユーザーだけを取得する場合は次のようにします。

GET /api/users/1

このように、HTTPメソッドが同じGETでも、URLによって取得する対象を指定できます。

クエリパラメータを使用する

条件を指定してデータを取得するときは、クエリパラメータが使用されることもあります。

例えば、activeがtrueのユーザーを取得するAPIであれば、次のようなURLが考えられます。

GET /api/users?active=true

?より後ろのactive=trueがクエリパラメータです。

クエリパラメータは、検索条件や絞り込み、並び替え、ページ番号など、取得するデータの条件を指定するときによく使用されます。

クエリパラメータとリクエストボディの違い

Web APIでは、サーバーへ値を渡す方法として、「クエリパラメータ」のほかに「リクエストボディ」もよく使用されます。

クエリパラメータはURLに値を含める方法です。

GET /api/users?active=true

一方、リクエストボディはHTTPリクエストの本文部分にデータを含める方法です。例えば、新しいユーザーを作成するPOSTでは、次のようなJSONデータをリクエストボディとして送信できます。

{
  "name": "Taro",
  "email": "taro@example.com"
}

基本的には、データの取得条件を指定する場合はクエリパラメータ、登録や更新するデータを送信する場合はリクエストボディと考えると分かりやすいでしょう。

項目クエリパラメータリクエストボディ
データを指定する場所URLHTTPリクエストの本文
主な用途検索・絞り込み・並び替えなど登録・更新するデータの送信など
例?active=true&page=2{"name":"Taro"}
よく使われるHTTPメソッドGETなどPOST、PUT、PATCHなど

HTTPのGETでも技術的にはリクエストボディを含められる場合がありますが、その内容には一般的に定義された意味がなく、対応していないサーバーやミドルウェアもあります。そのため、データを取得する条件を渡す場合は、基本的にURLのパスやクエリパラメータを使用します。

POSTとは?

POSTは、データをサーバーへ送信して処理してもらうために使用するHTTPメソッドです。Web APIでは、新しいリソースを作成するときによく使用されます。

例えば、新しいユーザーを登録する場合は次のようなリクエストを送ります。

POST /api/users

リクエストボディには、登録するユーザー情報を含めます。

{
  "name": "Taro",
  "email": "taro@example.com"
}

サーバー側でユーザーが作成され、例えばIDが自動的に割り当てられます。

{
  "id": 1,
  "name": "Taro",
  "email": "taro@example.com"
}

この例では、クライアントは「ユーザーを作成してほしい」と依頼し、新しいユーザーのIDはサーバー側で決定しています。

POSTは「新規作成専用」のメソッドではありません。対象リソースへデータを送信して処理を依頼するメソッドであり、APIの設計によっては新規作成以外の処理にも使用されます。

PUTとは?

PUTは、指定したリソースをリクエストの内容で置き換えるために使用するHTTPメソッドです。

例えば、現在のユーザー情報が次のようになっているとします。

{
  "id": 1,
  "name": "Taro",
  "email": "taro@example.com",
  "age": 30
}

このユーザー情報を更新するため、次のようなリクエストを送ります。

PUT /api/users/1

リクエストボディには、更新後のリソースを表す内容を送信します。

{
  "id": 1,
  "name": "Jiro",
  "email": "jiro@example.com",
  "age": 31
}

PUTでは、対象リソースの現在の表現をリクエストの内容で置き換えることが基本的な意味です。そのため、「ユーザー名だけ変更したいからnameだけ送る」という部分更新を表現したい場合は、一般的には後述するPATCHが適しています。

また、PUTは、既存のリソースを置き換えるだけでなく、指定したURLにリソースが存在しない場合、そのURLに新しいリソースを作成するために使用されることもあります。ただし、実際に新しいリソースを作成できるかどうかは、APIの仕様によって異なります。

POSTとPUTの違い

POSTとPUTは、どちらもリクエストボディを送信できるため混乱しやすいHTTPメソッドです。

大きな違いの一つが、対象リソースの指定方法と処理の意味です。

例えば、サーバー側に新しいユーザーを作成してもらうAPIでは、次のようなPOSTが考えられます。

POST /api/users

この場合、サーバーが新しいユーザーを作成し、IDを決定する設計にできます。

一方、PUTではクライアントが対象となるURLを指定します。

PUT /api/users/1

この場合、/api/users/1という対象リソースをリクエストの内容で置き換えることを要求します。対象が存在しない場合に新しく作成できるかどうかはAPIの設計にもよりますが、HTTPのPUT自体は新しいリソースを作成する場合にも使用できます。

また、PUTはべき等ですが、POSTはべき等ではないという違いもあります。

PATCHとは?

PATCHは、リソースを部分的に変更するためのHTTPメソッドです。

例えば、現在のユーザー情報が次のようになっているとします。

{
  "id": 1,
  "name": "Taro",
  "email": "taro@example.com",
  "age": 30
}

このユーザーのnameだけをJiroに変更したい場合は、例えば次のようなリクエストを送ります。

PATCH /api/users/1

リクエストボディには変更内容を送ります。

{
  "name": "Jiro"
}

更新後は次のようになります。

{
  "id": 1,
  "name": "Jiro",
  "email": "taro@example.com",
  "age": 30
}

nameだけが変更され、emailやageはそのままです。

PUTとPATCHの違い

PUTとPATCHは、どちらもデータの更新で使用されることがあるため、特に混乱しやすいHTTPメソッドです。

大きな違いは、PUTが対象リソースの表現を置き換えるメソッドなのに対して、PATCHはリソースへ部分的な変更を適用するメソッドであることです。

比較項目PUTPATCH
主な目的リソースを置き換えるリソースを部分的に変更する
送信する内容更新後のリソースを表す内容変更内容
一部だけ変更基本的にはPATCHが適している得意
べき等性ありHTTP仕様上は保証されない

例えば、次のユーザー情報があるとします。

{
  "name": "Taro",
  "email": "taro@example.com",
  "age": 30
}

PUTでは、例えば更新後のユーザー情報を送ります。

{
  "name": "Jiro",
  "email": "jiro@example.com",
  "age": 31
}

一方、nameだけを変更するPATCHであれば、例えば変更する部分だけを送ります。

{
  "name": "Jiro"
}

実際のAPIでPUTやPATCHのリクエストボディをどのように扱うかは、そのAPIの仕様にも左右されます。「PUTなら必ずJSONの全フィールドを送信しなければならない」と単純に考えるのではなく、利用するAPIの仕様を確認することも重要です。

DELETEとは?

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

例えば、IDが1のユーザーを削除する場合は、次のようなリクエストを送ります。

DELETE /api/users/1

このリクエストによって、/api/users/1で指定されるリソースの削除をサーバーへ要求します。

APIによってはレスポンスボディを返す場合もあれば、正常に削除されたことを示すステータスコードだけを返す場合もあります。

GET・POST・PUT・PATCH・DELETEの違いまとめ

ここまで説明した5つのHTTPメソッドの違いをまとめると、次のようになります。

HTTPメソッド主な用途具体例
GET取得ユーザー情報を見る
POST送信・作成新しいユーザーを登録する
PUT置き換えユーザー情報を新しい内容に置き換える
PATCH部分変更ユーザー名だけ変更する
DELETE削除ユーザーを削除する

ユーザーAPIを例にすると、次のような設計が考えられます。

GET    /api/users       ユーザー一覧を取得
GET    /api/users/1     IDが1のユーザーを取得
POST   /api/users       ユーザーを作成
PUT    /api/users/1     IDが1のユーザーを置き換える(存在しない場合は作成されることもある)
PATCH  /api/users/1     IDが1のユーザーを部分的に変更
DELETE /api/users/1     IDが1のユーザーを削除

このように並べると、それぞれの役割を理解しやすくなります。

HTTPメソッドとCRUDの関係

Web APIでは、HTTPメソッドと「CRUD」を対応させて説明することがあります。

CRUDとは、データを扱う基本的な4つの操作を表した言葉です。

CRUD意味HTTPメソッドの代表例
Create作成POST、PUT
Read読み取りGET
Update更新PUT、PATCH
Delete削除DELETE

それぞれの頭文字を取って「CRUD」と呼ばれています。

例えば、ユーザー管理システムであれば、「ユーザーを登録する」「ユーザーを見る」「ユーザー情報を変更する」「ユーザーを削除する」という基本操作をCRUDとして整理できます。

CRUDとHTTPメソッドはまったく同じ概念ではありません。CRUDはデータに対する基本操作の分類であり、HTTPメソッドはHTTPリクエストの意味を表すものです。Web APIでは両者を対応させて設計することが多い、と理解するとよいでしょう。

また、PUTは、既存のリソースを置き換えるだけでなく、指定したURLにリソースが存在しない場合、そのURLに新しいリソースを作成するために使用されることもあります。そのため、CRUDではCreateとUpdateの両方に対応する場合があります。ただし、実際にPUTで新しいリソースを作成できるかどうかは、APIの仕様によって異なります。

その他のHTTPメソッド

HTTPには、これまで紹介したGET、POST、PUT、PATCH、DELETE以外にも、HEAD、OPTIONS、CONNECT、TRACEなどのHTTPメソッドがあります。

一般的なWeb APIの開発ではGETやPOSTなどと比べて使用する機会は少ないですが、それぞれどのような役割を持つのか簡単に確認しておきましょう。

HEADとは?

HEADは、GETと同様のレスポンスヘッダーを取得しながら、レスポンスボディは取得しないHTTPメソッドです。

例えば、sample.zipというファイルのヘッダー情報だけを取得する場合は、次のようなリクエストを送ります。

HEAD /files/sample.zip

サーバーからは、例えば次のようなレスポンスヘッダーが返されます。

Content-Type: application/zip
Content-Length: 10485760

Content-Typeからファイルの種類、Content-Lengthからファイルサイズを確認できます。

GETではレスポンスボディも受け取りますが、HEADではレスポンスボディを受け取りません。そのため、大きなファイルをダウンロードする前にファイルサイズを確認するなど、データ本体を取得せずにヘッダー情報だけを確認したい場合に利用できます。

OPTIONSとは?

OPTIONSは、対象リソースに対して利用できる通信方法などを確認するためのHTTPメソッドです。

例えば、/api/usersに対して利用できるHTTPメソッドを確認する場合は、次のようなリクエストを送ります。

OPTIONS /api/users

サーバーからは、例えば次のようなAllowヘッダーが返される場合があります。

Allow: GET, POST, OPTIONS

この場合、対象リソースでGET、POST、OPTIONSがサポートされていることを示します。

また、WebアプリケーションではCORSにおいて、ブラウザーが実際のリクエストを送信する前に、事前確認としてOPTIONSリクエストを送信することがあります。

CONNECTとは?

CONNECTは、対象のサーバーとの間にトンネルを確立するためのHTTPメソッドです。

例えば、プロキシサーバーを経由してexample.comのポート443へ接続する場合は、次のようなリクエストが使用されます。

CONNECT example.com:443 HTTP/1.1
Host: example.com:443

プロキシサーバーが接続を許可すると、クライアントと接続先サーバーの間でデータをやり取りするためのトンネルが確立されます。

CONNECTは主にHTTPプロキシなどで使用されるため、一般的なWeb APIを開発するときに直接使用する機会は多くありません。Web APIを学び始めた段階では、「プロキシを経由した通信などで使用されるHTTPメソッド」と覚えておけばよいでしょう。

TRACEとは?

TRACEは、サーバーが受信したリクエストをレスポンスとして返すことで、リクエストがどのように届いたのかを確認するためのHTTPメソッドです。

例えば、次のようなリクエストを送ります。

TRACE /api/users HTTP/1.1
Host: example.com

TRACEに対応しているサーバーでは、受信したリクエストの内容がレスポンスとして返されるため、通信経路の途中でリクエストがどのように扱われたのかを確認するために利用できます。

ただし、TRACEは主に診断を目的としたHTTPメソッドであり、一般的なWeb API開発で使用する機会は多くありません。そのため、まずはGET、POST、PUT、PATCH、DELETEの5つを理解することを優先するとよいでしょう。

HTTPメソッドの「安全」とは?

HTTPメソッドについて調べていると、「安全なメソッド(safe method)」という言葉が出てくることがあります。

HTTPにおける「安全」とは、ウイルスや攻撃に対して安全という意味ではありません。クライアントがサーバー上の状態変更を要求しないメソッドという意味です。

GET、HEAD、OPTIONS、TRACEは安全なメソッドとして定義されています。

例えば、GETはデータを取得するために使用するため安全なメソッドです。一方、POST、PUT、PATCH、DELETEはサーバー上の状態を変更する操作に使用されるため、安全なメソッドには分類されません。

安全なメソッドでもアクセスログが記録されるなど、サーバー側で何らかの処理がまったく発生しないという意味ではありません。

HTTPメソッドの「べき等」とは?

HTTPメソッドを理解するうえでもう一つ重要なのが「べき等(idempotent)」です。

べき等とは、簡単にいうと、同じリクエストを1回実行した場合と、複数回実行した場合で、意図したサーバー上の最終状態が同じになる性質です。

例えば、次のDELETEを考えてみます。

DELETE /api/users/1

1回目のリクエストでユーザーが削除されます。同じリクエストをもう一度送った場合、すでにユーザーが存在しないためレスポンスのステータスなどが異なる可能性はありますが、「IDが1のユーザーが存在しない」という最終状態は変わりません。

HTTPメソッドべき等
GET○
HEAD○
PUT○
DELETE○
OPTIONS○
TRACE○
POST×
PATCH×

HTTP仕様上、PUTとDELETEはべき等ですが、POSTとPATCHはべき等とは定義されていません。

例えば、商品の注文を作成するPOSTリクエストを何度も送信すると、APIの実装によっては複数の注文が作成される可能性があります。

一方、PATCHは仕様上べき等ではありませんが、APIや変更方法によっては、同じリクエストを繰り返しても結果が変わらないように設計することもできます。

JavaScriptからHTTPメソッドを指定する例

JavaScriptのfetch()を使用すると、HTTPメソッドを指定してWeb APIへリクエストを送信できます。

GETの場合

ユーザー情報を取得する場合は、例えば次のように記述できます。

fetch("https://example.com/api/users/1")
  .then(response => response.json())
  .then(data => console.log(data));

fetch()では、methodを省略した場合はGETが使用されます。明示的に記述する場合は次のようにします。

fetch("https://example.com/api/users/1", {
  method: "GET"
});

POSTの場合

新しいユーザー情報を送信する場合は、例えば次のように記述できます。

fetch("https://example.com/api/users", {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "Taro",
    email: "taro@example.com"
  })
});

methodにPOSTを指定し、bodyにサーバーへ送信するデータを設定しています。

PUTの場合

ユーザー情報を置き換える場合は、例えば次のように記述できます。

fetch("https://example.com/api/users/1", {
  method: "PUT",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "Jiro",
    email: "jiro@example.com",
    age: 31
  })
});

PATCHの場合

ユーザー名だけを変更する場合は、例えば次のように記述できます。

fetch("https://example.com/api/users/1", {
  method: "PATCH",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "Jiro"
  })
});

DELETEの場合

ユーザーを削除する場合は、例えば次のように記述できます。

fetch("https://example.com/api/users/1", {
  method: "DELETE"
});

このように、fetch()のmethodを変更することで、さまざまなHTTPメソッドを使用できます。

HTTPメソッドはAPIによって使い方が違う場合がある

ここまで紹介した使い分けはHTTPの意味に基づく基本的な考え方ですが、実際のWeb APIがすべてまったく同じ設計になっているわけではありません。

例えば、あるAPIではユーザー情報の一部更新にPATCHを使用していても、別のAPIではPUTを使用している場合があります。また、特定の処理をPOSTで提供するAPIもあります。

外部のWeb APIを利用する場合は、「更新だから必ずPUT」「一部更新だから必ずPATCH」と決めつけず、そのAPIのドキュメントを確認することが重要です。

一方、自分でWeb APIを設計する場合は、それぞれのHTTPメソッドが持つ意味に沿って設計すると、APIを利用する側にも処理内容が伝わりやすくなります。

本記事のまとめ

この記事では「HTTPメソッド」について、以下の内容を説明しました。

  • GETは、主にリソースを取得するときに使用する
  • POSTはデータの送信・作成、PUTは置き換え、PATCHは部分変更、DELETEは削除に使用する
  • データの取得条件にはクエリパラメータ、登録・更新するデータにはリクエストボディがよく使用される
  • HEAD、OPTIONS、CONNECT、TRACEなどのHTTPメソッドも存在する
  • HTTPメソッドには「安全性」や「べき等性」といった性質がある

Web APIを学ぶ場合は、まずGET、POST、PUT、PATCH、DELETEの役割を覚え、特に混乱しやすいPUTとPATCHの違いを理解するとよいでしょう。

お読みいただきありがとうございました。

スポンサーリンク