はじめに
タイトルについて記事にしました。
この記事で得る内容は以下の通りです。
・ CRUD、主要なHTTPメソッド、べき等性と安全性、メソッドの誤用
■ Web API入門についての過去記事
・ Web API入門#1 〜APIとWeb API、Webの概要〜
・ Web API入門#2 〜REST、アーキテクチャについて〜
・ Web API入門#3 〜URIの基礎知識〜
・ Web API入門#4 〜クールなURIの設計方法について〜
・ Web API入門#5 〜HTTPの基礎〜
CRUD
Create,Read,Update,Deleteの4つの単語の頭文字をとったもので、データの作成・読み込み・更新・削除する機能のことをCRUDと呼びます。
基本的にWebサービスは、CRUDの機能があります。(どれか1つでも欠けるとサービスとして不安定...)
HTTPメソッドの理解を深めると、Webサービスの基本であるCRUDの機能を実装できるようになります。
主要なHTTPメソッド
HTTPメソッドは8つありますが、主要なメソッドは表の6つで、更にその中でよく使われるのが上の4つです。
メソッド | CRUD | 役割 |
---|---|---|
GET | Read | リソースの取得 |
POST | Create | 子リソースの作成、リソースへのデータの追加...etc |
PUT | Create / Update |
リソースの更新(存在していなければ作成) |
DELETE | Delete | リソースの削除 |
HEAD | - | リソースのヘッダ(メタデータ)の取得 |
OPTIONS | - | リソースがサポートしているメソッドの取得 |
各メソッドの中でも特徴的な3つをご紹介します。
POSTメソッド
POSTメソッドは、リソースの作成が主ですが、リソースを更新したり削除することができます。
※ 理由は後述しますが、基本的にPOSTはPOSTの役割に使った方が良いです。
PUTメソッド
PUTメソッドの主な役割はリソースの更新ですが、リソースが存在していなければ新規作成をします。
CRUDの中でも、CreateとUpdateの機能を兼ね備えるのが特徴的です。
OPTIONSメソッド
OPTIONSメソッドは、例えば、特定のリソースに対してGETメソッドのみ実行できる場合は、OPTIONSメソッドを実行すると、GETメソッドとOPTIONSメソッドを使うことができます。
従って、GET/POST/PUT/DELETEメソッドの4つを許容しているリソースであれば、OPTIONメソッドを実行すると、許容している4つのメソッドがOPTIONSメソッドのレスポンスに返ってきます。
べき等性と安全性
べき等性
べき等性とは、ある操作を何回行っても結果は同じという意味です。
例えば、GETメソッドはリソースの取得をするので何回行っても結果は同じですが、POSTメソッドは、リソースを作成する度にリソースが増えるので結果が同じではなくなります。
安全性
操作対象のリソースの状態を変化させないことです。
GETメソッドは、リソースの取得を行い、リソースの状態を変化させることはないので安全性といえます。
一方、PUTメソッドを使うことでリソースが更新されるので、こちらは安全性とはいえません。
各メソッドのべき等性と安全性の特徴については、以下の通りです。
メソッド | 特徴 |
---|---|
GET | べき等かつ安全 |
POST | べき等でも安全でもない |
PUT | べき等だが安全でもない |
DELETE | べき等だが安全でもない |
HEAD | べき等かつ安全 |
OPTIONS | べき等かつ安全 |
メソッドの誤用
メソッドを誤った用途に使うと、べき等性を持ったメソッドであっても意味がなくなってしまったり
安全性が確立できなくなったりしてしまいます。代表的な例をいくつかご紹介します。
リソースの取得以外でPOSTメソッドを使う
例えば、明らかに何かリソースを削除する、https://slamp.slamp.ochicom/v1/posts/deleteのような
動詞が含まれているURIに対してGETメソッドを実行することです。(設計もNGですが)
GETメソッドであるのに、リソースを操作してしまい安全性が失わなわれます。
他のメソッドをPOSTメソッドで代用する
POSTメソッドは本来リソースの作成や追加が役割ですが、他のメソッドが持つ機能も代用できてしまいます。
GETメソッドはべき等であり安全ですが、GETメソッドを使うべき所をPOSTメソッドで代用してしまうと、べき等でも安全でもなくなります。他のPUTメソッドやDELETEメソッドも、べき等ではなくなってしまいます。
PUTメソッドで相対的な値を用いる
例えば、元の値に+50加算するといったPUTメソッドがあったとします。
これは、実行する度に処理結果が変わりますので、べき等ではありません。
ですので、PUTメソッドを使うのであれば、相対的でなく、絶対的な値を指定します。
一例ですが、100から150に値を変えるのであれば、+50加算するのでなく、150という値を指定します。