RESTfm で Update する
RESTfm で Read する方法はこれまで十分に見てきました。次は Update です。
とはいえ、基本的な方法は GET と変わりません。アクセスする URI を構成し、そこに対して PUT メソッドでアクセスするだけです。PUT なので Webブラウザ ではアクセスできませんが、それ以外は GET と変わりません。
Update できるのはレコードに対してだけ
公式ドキュメントを見るとわかりますが、Update をする対象はレコード以外にありません。Update という動作の内容を考えれば当然のことではありますが、レコードの Update しか対象となる動作が無いゆえに分かりやすく、誤りも少ないと思います。
基礎となる URI と使用するデータベースおよびレイアウト
説明を分かりやすくするために、RESTfm を以下の場所に配置したと仮定します。
http://hogehoge/RESTfm/
また、説明に使うデータベース名はMember
とし、同じくレイアウト名はcategories
とします。
レコードを Update する(レコードID を用いて URI を構成する)
それではレコードを Update します。そのためには対象となるレコードのレコードIDを指定する必要があります。そのレコードIDをここでは仮に123456789
とします。この条件のもと、URI を構成すると以下のようになります。
http://hogehoge/RESTfm/Member/layout/categories/123456789
上記の URI がアクセスする URI です。
レコードを Update する(検索条件を用いて URI を構成する)
前述の方法では レコードID を指定して更新対象のレコードを特定していますが、さすがにこれだけでは不便だろうということで、レコードの検索を経由してのレコード指定をする方法も用意されています。
例えばfoo
というフィールドの値がbarbar
であるレコードを Update の対象にしたい場合は以下の URI を叩きます。記号類(「=」など)や日本語はエンコードする必要がありますがここでは見やすくするために省略していますので注意してください。
http://hogehoge/RESTfm/Member/layout/categories/foo===barbar
注意点として、検索によりレコードが一意に定まる必要があります。複数のレコードが検索により引っかかる場合はエラーになります。
レコードを Update する(変更する内容を指定する)
対象のレコードについて、そのレコードのどのフィールドをどんな値に変更するかを指定します。ここでは仮にfoo
というフィールドをbar
と変更するとしましょう。すると送信する JSON は以下のようになります。
{
"data": [
{
"foo": "bar"
}
]
}
PHP で上記 JSON を作る場合は以下のようにすればいいでしょう。
$data = array("data" => [
array("foo" => "bar")
]);
$post_json = json_encode($data);
レコードを Update する(PHP の curl を用いる)
URI も定まり、送るべき JSON も作れました。あとは実際に PUT するだけです。念のため、PHP でのコード例を以下に示します。もちろん PHP 以外でも OK です。
$uri = "http://hogehoge/RESTfm/Member/layout/categories/foo%3D%3D%3Dbarbar";
$request = "PUT";
$headers = array("Content-Type: application/json");
$data = array("data" => [
array("foo" => "bar")
]);
$post_json = json_encode($data);
$options = array(
CURLOPT_URL => $uri,
CURLOPT_CUSTOMREQUEST => $request,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $post_json,
CURLOPT_RETURNTRANSFER => true
);
$curl = curl_init();
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
オプションパラメータ
ここまでで Update の基本は大丈夫でしょう。ただ、さらに Update を便利にするパラメータが用意されています。詳しくは公式ドキュメントを参照してほしいのですが、いくつか紹介をします。
-
RFMappend
- このパラメータを指定すると、データとして送った内容を上書きするのではなく付け加えます
- その名のとおりアペンドするわけです
-
RFMelsePOST
- このパラメータを指定すると、Update の対象となるレコードが存在しない場合、レコードを Create します
-
RFMscript
- このパラメータを指定すると、Update した後に指定のスクリプト(「=」でつないでスクリプト名を指定)を実行します
- スクリプトに引数を用いる場合はさらに
RFMscriptParam
パラメータを付与します
bulk も可能
GET の記事で記載した bulk での Update も可能です。詳しくはやはり公式ドキュメントをどうぞ。
Update(PUT)は慎重に
GET メソッドは単に情報を取得するだけですので誤った URI を叩いたりしてしまってもエラーが出るくらいですが、PUT の場合は誤るとデータを更新してしまいます。したがって、テストデータなどで十分に仕様を把握した上で実戦投入するといいでしょう。
また、エラーチェック(ログ出力)や変更されたかどうかのチェックを組み込むことで、何かあった際の対応が楽になると思うので、そこらへんも意識してコードを書くようにしてみてください。