RAD サーバー コンポーネントの利用
RAD サーバー(EMS) への移動
リクエストの処理をカスタム クラスまたはコンポーネントへ委譲する機能
RAD Server のカスタム リソース API に、リクエストの処理をリソース モジュール Delphi フィールド(カスタム エンドポイント パブリッシャ クラス / コンポーネント)に委譲する機能が追加されました。 例:
type TEmpsProvider = class(TComponent, IEMSEndpointPublisher) private class var FArray: TJSONArray; private function GetItemByID(ARequest: TEndpointRequest): Integer; class constructor Create; class destructor Destroy; public procedure Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); overload; [ResourceSuffix('./{id}')] procedure GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); overload; [ResourceSuffix('./{id}')] procedure Put(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); procedure Post(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); [ResourceSuffix('./{id}')] procedure Delete(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); end; [ResourceName('Test')] TTestResource = class(TDataModule) public Emps: TEmpsProvider; constructor Create(AOwner: TComponent); override; end;
以下のリクエストは、Emps オブジェクトの TEmpsProvider メソッドによって処理されます:
GET http://localhost/test/emps
- TEmpsProvider.Get メソッドGET http://localhost/test/emps/1
- TEmpsProvider.GetItem メソッド
さらに:
- リクエストの処理は、オブジェクト型のリソース モジュール フィールドに委譲することが可能です。オブジェクト型は、IEMSEndpointPublisher インターフェイスを実装する任意のクラス(TComponent 下位クラスも含む)がなりえます。クラスは、エンドポイント パブリッシャ クラスと呼ばれます。
- デフォルトでは、すべてのクラス エンドポイントが、リソース モジュール フィールド名と同じリソース接尾辞を取得します。これは、リソース モジュール フィールドの属性を変更することで上書き可能です:
- ResourceName - フィールド名を上書きするもの。
- ResourceSuffix - リソースの接尾辞を上書きするもの。
- クラス エンドポイントは、ResourceSuffix 属性によってマーク付けされます。接尾辞が "./" で始まる場合、指定された接尾辞はリソース モジュール フィールドのデフォルトのリソース接尾辞の後ろに追加されます。
- リソース モジュール エンドポイントに対して指定された属性はいずれも、クラス エンドポイントに対して指定されます。属性は、優先度の順にいずれか一か所で指定することが可能です(リストのはじめの方が優先度が低く、より高い優先度が低い優先度の属性を上書きします):
- クラス エンドポイント
- リソース モジュール フィールド。属性の最初の引数は、クラス エンドポイント名です。
- リソース モジュールの登録で指定される TEMSResourceAttributes。TEMSResourceAttributes の呼び出しで使用される名前は、<リソース モジュール フィールド名>.<クラス エンドポイント名> です。
JSON 処理のためのヘルプ コンポーネント
コンポーネントに処理を委譲する新しい機能を利用して、RAD Studio 10.3 では、JSON の処理作業をシンプルにするための新しいコンポーネントが導入されており、特にデータベース クエリが呼び出される際に利用されます。 コンポーネントは、RAD Server リソース(またはデータ モジュール)へマップされるクラスに追加でき、HTTP メソッドは、コードを記述することなくそれらにマップすることができます。
- TEMSFileResource コンポーネントには、パスおよびデフォルト ファイル名を示すプロパティがあります。
- TEMSDataSetResource は、DataSet への参照、および、ページング サイズのためのプロパティ、ソートおよびページング クエリのパラメータ名があります。
このサンプル コードのように、両コンポーネントは、特定の HTTP 動詞を受け取るよう設定され、ホスト リソースと接続されます:
[ResourceName('Notes')] TNotesResource1 = class(TDataModule) FDConnection1: TFDConnection; // connects to SQLite DB with "notes" table FDQuery1: TFDQuery; // SELECT * FROM Notes [ResourceSuffix('list', '/')] [ResourceSuffix('get', '/{id}')] [ResourceSuffix('put', '/{id}')] [ResourceSuffix('post', '/')] [ResourceSuffix('delete', '/{id}')] EMSDBResource1: TEMSDataSetResource; end; // database resource [ResourceSuffix('/')] EMSDBResource1: TEMSDataSetResource; [ResourceSuffix('/')] [EndpointProduce('get', 'image/jpeg, image/png')] EMSDBResource1: TEMSDataSetResource; // file resource [ResourceSuffix('/')] [EndpointProduce('get', 'application/pdf')] EMSFileResource1: TEMSFileResource;