クラス関数の呼び出し
RESTリクエストを使って、ORDAデータモデルに定義されている データモデルクラス関数 を呼び出すことで、ターゲット 4Dアプリケーションの公開API を活用できます。
シングルトン関数を呼び出すこともできます。詳細 は このページ を参照ください。
関数を呼び出すには () を省き、適切な ORDA のコンテキストにおいて POST リクエストでおこないます。 たとえば、City DataClassクラスに getCity()
関数を定義した場合、次のリクエストで呼び出すことができます:
/rest/City/getCity
POST リクエストのボディに関数に渡す引数を含めます: ["Aguada"]
この呼び出しは、4Dランゲージでは次のステートメントに相当します:
$city:=ds.City.getCity("Aguada")
RESTリクエストで直接呼び出せるのは
exposed
キーワードが付いた関数のみです。 公開vs非公開関数 の章を参照ください。
関数の呼び出し
関数は必ず REST の POST リクエストで呼び出さなくてはなりません (GETリクエストの場合はエラーが返されます)。
サーバーのデータストアーの対応するオブジェクトを対象に、関数は呼び出されます。
クラス関数 | シンタックス |
---|---|
DataStore クラス | /rest/$catalog/DataStoreClassFunction |
DataClass クラス | /rest/\{dataClass\}/DataClassClassFunction |
EntitySelection クラス | /rest/\{dataClass\}/EntitySelectionClassFunction |
/rest/\{dataClass\}/EntitySelectionClassFunction/$entityset/entitySetNumber | |
/rest/\{dataClass\}/EntitySelectionClassFunction/$filter | |
/rest/\{dataClass\}/EntitySelectionClassFunction/$orderby | |
Entity クラス | /rest/\{dataClass\}(key)/EntityClassFunction/ |
シングルトンクラス | /rest/$singleton/SingletonClass/SingletonClassFunction ($singleton ページ 参照) |
/rest/\{dataClass\}/Function
は DataClassクラスまたは EntitySelectionクラスの関数を呼び出すのに使えます (/rest/\{dataClass\}
はデータクラスの全エンティティをエンティティセレクションに返します)。
EntitySelection クラスの関数が先に探されます。 見つからない場合に、DataClassクラスを探します。 つまり、同じ名称の関数が DataClassクラスと EntitySelectionクラスの両方に定義されている場合、DataClassクラスの関数が実行されることはありません。
プロジェクトがコンパイル済みモードで実行される場合、RESTサーバーは常にプリエンプティブプロセスを使用するため、RESTリクエストから呼び出されるすべての 4Dコードは スレッドセーフでなければなりません (プリエンプティブプロセスを使用 の設定値 は、RESTサーバーによって無視されます)。
引数
ORDAユーザークラスに定義された関数には、引数を渡すことができます。 サーバーサイドでこれらの引数は、クラス関数の 宣言されたパラメーター に受け渡されます。
次のルールが適用されます:
- 引数はすべて、POSTリクエストのボディ に渡す必要があります:
- 引数はコレクション (JSON形式) の中に格納する必要があります。
- JSON コレクションがサポートしているスカラーなデータ型はすべて引数として渡せます。
- エンティティやエンティティセレクションも引数として受け渡せます。 この際、対応する ORDAオブジェクトにデータを割り当てるために RESTサーバーが使用する専用の属性 (
__DATACLASS
,__ENTITY
,__ENTITIES
,__DATASET
) を JSONオブジェクトに含めなくてはなりません。
エンティティを引数として受け取る例題 と エンティティセレクションを引数として受け取る例題 を参照ください。
スカラー値の引数
引数は、ボディに定義されたコレクションに格納します。 たとえば、DataClass クラス関数 getCities()
がテキスト引数を受け取る場合:
/rest/City/getCities
ボディの引数: ["Aguada","Paris"]
引数としてサポートされるのは、JSONポインターを含むすべての JSON のデータ型 です。 日付は ISO 8601形式の文字列として渡せます (例: "2020-08-22T22:00:000Z")。
エンティティ引数
引数として渡されたエンティティは、キー (__KEY プロパティ) によってサーバー上で参照されます。 リクエストにおいてキーが省略されていれば、サーバーのメモリに新規エンティティが読み込まれます。 エンティティが持つ属性について、値を受け渡すことも可能です。 サーバー上でこれらの値は自動的に当該エンティティ用に使用されます。
サーバー上の既存エンティティについて変更された属性値をリクエストが送信した場合、呼び出した ORDAデータモデル関数は自動的に変更後の値で実行されます。 この機能によって、たとえばエンティティに対する処理の、すべてのビジネスルールを適用した後の結果をクライアントアプリケーションから確認することが可能です。 その結果をもとにエンティティをサーバー上で保存するかどうかを判断できます。
プロパティ | タイプ | 説明 |
---|---|---|
エンティティの属性 | mixed | 任意 - 変更する値 |
__DATACLASS | String | 必須 - エンティティのデータクラスを指定します |
__ENTITY | Boolean | 必須 - true は引数がエンティティであることをサーバーに通知します |
__KEY | 混合 (プライマリーキーと同じ型) | 任意 - エンティティのプライマリーキー |
__KEY
が省略された場合、指定した属性を持つ新規エンティティがサーバー上で作成されます。__KEY
が提供された場合、__KEY
が合致するエンティティが指定した属性とともにサーバー上に読み込まれます。
エンティティを 作成 または 更新 する例題を参照ください。
リレートエンティティ引数
エンティティ引数 と同じプロパティを持ちます。 異なる点は、リレートエンティティは存在していなければならないため、プライマリーキーを格納する __KEY を省略できません。
リレートエンティティを持つエンティティを 作成 または 更新 する例題を参照ください。
エンティティセレクション引数
引数として渡すエンティティセレクションはあらかじめ $method=entityset によって定義されている必要があります。
変更されたエンティティセレクションをリクエストがサーバーに送信した場合、呼び出した ORDAデータモデル関数は自動的に変更後のエンティティセレクションで実行されます。
プロパティ | タイプ | 説明 |
---|---|---|
エンティティの属性 | mixed | 任意 - 変更する値 |
__DATASET | String | 必須 - エンティティセレクションのエンティティセットID (UUID) |
__ENTITIES | Boolean | 必須 - true は引数がエンティティセレクションであることをサーバーに通知します |
エンティティセレクションを引数として受け取る例題 を参照ください。