0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FileMakerAdvent Calendar 2016

Day 20

RESTfm で Update してみよう

Last updated at Posted at 2016-12-19

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 の場合は誤るとデータを更新してしまいます。したがって、テストデータなどで十分に仕様を把握した上で実戦投入するといいでしょう。

また、エラーチェック(ログ出力)や変更されたかどうかのチェックを組み込むことで、何かあった際の対応が楽になると思うので、そこらへんも意識してコードを書くようにしてみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?