4Dは、あなたの4Dデータベースに保存したデータへ直接アクセスできる強力なRESTサーバーを提供しています。これによって、例えば、モダンなフロントエンド・テクノロジー(Angular、Reactなど)を使ったAPIの構築が可能です。このブログでは、4Dの堅牢なRESTサーバーを初めてご紹介します。また、APIテストツール、Postmanを使用して、作成、取得、更新、削除 (CRUD) の各操作をテストする方法を説明します。
注意:もしすでにRESTサーバーと4Dデータベースの構成方法をご存知の場合は、この後の2章はスキップしてください。
4D RESTサーバーを使えるようにするには、最初に構成が必要です(シングル・クリックで起動して動作します)。「データベース設定」の「Web / RESTリソース」ページの「RESTサーバーとして公開」にチェックするだけでRESTリクエストを処理することができます。
このステップは、すでにデータベースを作成してRESTサーバーを有効にしていると仮定しています。ストラクチャーに新しいテーブル [Tasks]とその2つの属性:Title (Alpha)とComplete (Boolean)を作成します。初期設定では、全てのテーブルはRESTで公開されます:
重要:テーブルとフィールド名はJSONに準拠(発音区別文字やスペースは不可)しなければなりません。
指示する方法は簡単です。WEBブラウザーを開いて、ADDRESS/PORTの後に”/rest”を挿入します。(全ての4D REST URLリクエストは/restで始まります。) 例えば、[Task]データクラスの全てのエンティティーを得たい場合は、以下のように処理できます:
4D RESTサーバーについて驚くべきことは、CRUD(とそれ以上の)操作をAPIが提供することです…では、見てみましょう! エンティティーの作成、読み込み、更新あるいは削除にあたっては1行のコードも必要ありません。全てがセットアップされています。よく知られているように、CRUDはデータベース操作の中で最も重要なグループです。ユーザーがデータを作成し、管理するのに必要なメインの機能だからです。
この驚異的なAPIをテストするために、Postman(RESTに最適のAPIをテストするための素晴らしいツール)を使います。Postmanは、GET、POST、PUT/UPDATE、DELETEや様々な他のリクエスト・メソッドのように、HTMLメソッドを作るための洒落たユーザー・インターフェイスを提供します。
注意:Postmanの使用は単純明快ですが、もし始めるにあたってヘルプが必要であれば、このビデオを見てください。
Postmanをダウンロードしたら、異なるリクエストを作ります。とても明快なリクエストから始めましょう。タスクのリストを([Tasks]テーブルから)検索します。前に述べたように、[Task]データクラスの全てのエンティティーを得るためには、ADDRESS/PORTの後に/rest/NameOfTheDatabaseを挿入します。
ご覧の通り、タスクのリストを検索するためには1行のコードも必要ありません
データクラスに新しいタスクを加えることもできます… これもコード不要です。 APIはすでに設定されています!
新しいエンティティーを作成するために、このURLは新しいポスト・リクエストを起動します: ADDRESS/PORP/rest/NameOfTheDataclass/?$method=update。それを実行するには、アプリケーションにJSONリクエストを送る必要があります。もしGETリクエストから結果をチェックすれば、新しいタスクを作成するのに必要な鍵となるアイデアが得られるでしょう。では、このロジックに従って、私たちにはタイトルと完全なフィールドだけが必要で、その他(キー、タイムスタンプ、スタンプ、ID)は4Dが対応します。
最初のタブ(GETメソッド)に戻り、送信をクリックしてタスクが追加されたことを確認します。4Dの出力フォームにも行き、新しいタスクが追加されているか確認します。
エンティティーを更新するには、エンティティーを作成したのと同じメソッドを使います。$method=updateは1つのPOST中の1つ以上のエンティティーを更新できます。それを実行するには、オブジェクトの中の_KEYと_STAMPパラメータを修正した属性とともに渡す必要があります。
サンプルでは、ヘミングウェイの不朽の名作のひとつ『老人と海』を読みました。従いまして、タスクのcompleteステータスをtrueに変える必要があります。簡単にできます:
エンティティーの削除もシンプルです。サンプルでは、ID=3 (“test”のコール)のタスクを削除します。問題ありません!deleteメソッドを呼び出して、そのIDを特定します:dataclass(ID)?$method=delete。
データベースに戻り、エンティティーが削除されてことを確認します。
ご覧の通り、4D RESTサーバーはとても強力です。たった今、デモしたようなこと以上にリッチなAPIを提供します。わずかな時間でできることはもっとあります。詳細な<a href=“https://developer.4d.com/docs/en/REST/%7BdataClass%7D.html“>ドキュメント</a>を参照してください。この先のブログで、認証についてのtipを共有し、その後で、4DデータベースへwebアクセスするためにAngular 7とRESTで書かれた完全なフロントエンド・アプリケーションも説明します。
サーバーに接続されたクライアント(4D Remote)のデザインモードでセットしたブレークポイントは,ユーザー別に管理されており,サーバー側に保存されています。クライアント側からExecute on server
を呼び出してストアドプロシージャを開始した場合,そのサーバー側プロセスは,コマンドを呼び出した4D Remoteのアカウント権限で実行されます。したがって,ユーザー管理者(Administrator
)としてログインしたのであれば,総合管理者(Designer
)がセットしたブレークポイントは通過することになります。
サーバー側のプロセスをTRACE
コマンドでトレースした場合,サーバー側に表示されるデバッガは,ストアドプロシージャを開始したプロセスのユーザー権限ではなく,サーバー,つまりDesigner
の権限で実行されています。クライアント側のユーザー権限でデバッグするためには,クライアント側でブレークポイントをセットする必要があります。
v18(厳密には17r6)以降,4D ServerアプリケーションをWindowsのサービスとして登録した場合,「デスクトップとの対話」が使用できないようになりました。これは仕様です。アプリケーションをWindowsのサービスとして登録するには,4D Serverを管理者権限で起動し,「ファイル>現在のデータベースをサービスとして登録する」を選択します。過去のバージョンでは,その後,Windowsの「サービス>対話型サービスの検出」を開始すれば,4D Serverの「デスクトップとの対話」を有効にすることができました。
v18以降,サービスとして登録されたアプリケーションは,ヘッドレスモードで実行されます。このモードでは,一切のユーザーインタフェースが抑制され,アプリケーションからの出力はシステムイベントログや標準ストリーム(コマンドライン・インタフェース)に送られます。「デスクトップとの対話」は非サポートとなります。
WP INSERT DOCUMENT
は,Write Proドキュメントを結合するために使用することができます。挿入されるのは,ドキュメントの本文(body)だけであり,アンカー画像は除外されません。これは仕様です。インライン画像であれば,本文と一緒に挿入されます。
View Proのテーマカラー「なし(no color)」は,色を指定しない,という意味です。透明色のことではありません。たとえば,テキストのカラーを「なし」に変更した場合,その色はデフォルトつまりブラックとなります。これは仕様です。
4Dアプリケーションで同時に複数の印刷ジョブを実行することはできません。たとえば,サーバーアプリケーションで印刷コマンドを使用してPDFを出力するような場合,あるプロセスが印刷ジョブを開始した後に別のプロセスが印刷設定コマンド(SET PRINT OPTION
WP USE PAG SETUP
_o_PAGE SETUP
など)を使用すると,「印刷ジョブを開始した後にこのコマンドを使用することはできません」エラーが返されます。これは仕様です。複数のプロセスが並行して印刷コマンドを使用することが想定されている場合,印刷ジョブをセマフォで排他的に制御するか,ワーカーなどを使用して印刷ジョブのキューを管理する必要があります。
メソッドエディターの左端(ブロックコードのノードが表示される領域)にマウスポインターを移動すると,ポインターが変形し,右向きに変化します。これは仕様です。変形したマウスポインターは,クリック操作により,行全体が選択できることを示しています。
4Dは,コンパイルモードで発生するエラーをインタープリターモードで発見し,デバッグできるよう,できるだけ同じ条件でエラーが発生するように設計されていますが,いくつかのエラーは,歴史的な経緯により,インタープリターモードでは発生せず,ON ERR CALL
でも抑止することができません。代表的な例は「範囲チェック」のランタイムエラーです。たとえば,パラメーターの$1
が未定義の場合,インタープリターモードであれば,そのままメソッドに渡してもエラーになりません。コンパイルモードでは,「範囲チェック」のランタイムエラーとなります。ON ERR CALL
でエラーダイアログを抑止することはできないため,Count parameters
でパラメーター数をチェックすることが必要であり,インタープリターモードではランタイムエラーが発生しないため,気をつけてコーディングするしかありません。これは仕様です。
18 R2では,_O_DISABLE BUTTON
および_O_ENABLE BUTTON
コマンドが廃止されました。コマンドはトークナイズされ,コンパイルも成功しますが,呼び出した場合,「未実装のコマンド」エラーが返されます。これは仕様です。v11以降,両コマンドの代わりにOBJECT SET ENABLED
を使用することが勧められています。