RESTfm で Delete する
Update の次は Delete になりますが……
実は内容や対象が Update とほぼ同じなのです。公式ドキュメントを見るとわかりますが、Update(PUT メソッド)と Delete(DELETE メソッド)の現れている場所が一緒だと気づくはずです。「2.8」と「2.11」の項目ですね。
それじゃあ Update の記事内容をそのまま Delete と読み替えてもらえばいい……わけですが、記事単体として成立させておくことに意義はあると思うので、完全に繰り返しの内容になってしまいますが、以下、書いていきましょう。
Delete できるのはレコードに対してだけ
公式ドキュメントを見るとわかりますが、Delete をする対象はレコード以外にありません。レイアウトやデータベースを Delete する API があってもいいかもしれませんが、それをわざわざ API で行うメリットとデメリットを考えると、リスクの方が大きいということで妥当な実装だと思います。
基礎となる URI と使用するデータベースおよびレイアウト
説明を分かりやすくするために、RESTfm を以下の場所に配置したと仮定します。
http://hogehoge/RESTfm/
また、説明に使うデータベース名はMember
とし、同じくレイアウト名はcategories
とします。
レコードを Delete する(レコードID を用いて URI を構成する)
それではレコードを Delete します。そのためには対象となるレコードのレコードIDを指定する必要があります。そのレコードIDをここでは仮に123456789
とします。この条件のもと、URI を構成すると以下のようになります。
http://hogehoge/RESTfm/Member/layout/categories/123456789
上記の URI がアクセスする URI です。
レコードを Delete する(検索条件を用いて URI を構成する)
前述の方法では レコードID を指定して更新対象のレコードを特定していますが、さすがにこれだけでは不便だろうということで、レコードの検索を経由してのレコード指定をする方法も用意されています。
例えばfoo
というフィールドの値がbar
であるレコードを Delete したい場合は以下の URI を叩きます。記号類(「=」など)や日本語はエンコードする必要がありますがここでは見やすくするために省略していますので注意してください。
http://hogehoge/RESTfm/Member/layout/categories/foo===bar
注意点として、検索によりレコードが一意に定まる必要があります。複数のレコードが検索により引っかかる場合はエラーになります。
レコードを Delete する(PHP の curl を用いる)
URI が定まったならばあとは DELETE メソッド PUT するだけです。PHP でのコード例を以下に示します。
$uri = "http\://hogehoge/RESTfm/Member/layout/categories/foo%3D%3D%3Dbar";
$request = "DELETE";
$headers = array("Content-Type: application/json");
$options = array(
CURLOPT_URL => $uri,
CURLOPT_CUSTOMREQUEST => $request,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true
);
$curl = curl_init();
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
オプションパラメータ
Delete にはオプションとしてパラメータが用意されています。以下に一例を簡単に説明します。
-
RFMscript
- このパラメータを指定すると、Delete した後に指定のスクリプト(「=」でつないでスクリプト名を指定)を実行します
- スクリプトに引数を用いる場合はさらに
RFMscriptParam
パラメータを付与します
bulk も可能
GET や PUT の記事で記載した bulk での Delete も可能です。詳しくはやはり公式ドキュメントをどうぞ。
Delete(DELETE メソッド)は慎重に
GET メソッドは単に情報を取得するだけですので誤った URI を叩いたりしてしまってもエラーが出るくらいですが、DELETE メソッドの場合はデータを削除してしまいます(当然ですが)。削除したデータを元に戻すためにはバックアップからの復活など、少なからず手間がかかります。
そう考えるとそもそも Delete を API で用いるのは最小限に限定した方がいいとは思います。もし利用する場合でもテストデータなどで十分に仕様を把握した上で実戦投入するといいでしょう。
エラーチェック(ログ出力)や削除前に削除データをいったんファイルに書き出すなどの処理を組み込めば不測の事態にも備えられます。そこらへんも意識してコードを書くようにしてみてください。