プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発
12c (12.2.1)
E70030-02
目次へ移動
目次

前
次

22 ADF RESTフレームワークを使用したRESTful Webサービスの使用方法

この章では、サポートされているHTTPメソッド、HTTPヘッダー、リクエストURLパラメータ、メディア・タイプおよびその他のADF RESTランタイムの概念と、RESTful Webサービスによって公開されているリソースに対するREST APIコールのためにサポートされているユースケースについて説明します。この章で説明している情報は、Webサービス・クライアントがREST APIを介して使用するRESTful Webサービスを作成する必要がある、ADFビジネス・コンポーネント開発者に役立ちます。

この章の内容は次のとおりです。

22.1 ADF RESTフレームワークについて

ADF RESTフレームワークは、Fusion Webアプリケーション開発者がRESTアーキテクチャ・スタイルに基づくWeb APIを公開できるようにするADFモデル・フレームワークです。フレームワーク自体はWeb APIを構成しませんが、ADFビジネス・コンポーネントのビジネス・オブジェクトに基づくリソースやRESTful Webサービスの作成およびそれらとの対話をサポートしています。RESTfulである結果、REST APIが使用され、このAPIにより、クライアント・アプリケーション開発者は公開されたビジネス・オブジェクトと対話できます。

Fusion Webアプリケーションにおいては、RESTful Webサービスによって操作されるADF RESTリソースは、ADFビジネス・コンポーネント・モデル・プロジェクトのデータ・モデルで公開されるビュー・オブジェクト・インスタンスが基礎となっています。ADFモデル・プロジェクトで作業するADFビジネス・コンポーネント開発者は、基礎となるビュー・オブジェクトから公開する属性のセット、使用可能にするアクション(標準CRUD操作、およびビュー・オブジェクト・インタフェースまたはビュー行インタフェースのいずれかで定義されているカスタム・メソッドの両方)、および結果として生成されたリソースを保存するビュー・リンク関係を決定できます。

ADFビジネス・コンポーネント開発者による設計時の選択内容は、RESTリソース定義XMLファイルで取得されます。Webサービス・クライアント開発者は、ADF RESTランタイム・フレームワークでサポートされているREST APIを介してこれらのリソース定義と対話できます。これにより、使用するサービス・クライアントはCRUD操作を起動して、RESTリソースおよびADFビジネス・オブジェクトと対話できます。データは、親子関係はそのままで、リソースの基礎となるビュー・オブジェクト・インスタンスによって形成されます。

22.1.1 ADF RESTリソースのユースケースと例

ADFモデル・プロジェクトで作業するADFビジネス・コンポーネント開発者は、ADF RESTリソースを公開し、Fusion Webアプリケーションに提供できます。

クライアントとサーバーによるリソース情報の交換をサポートするADF RESTフレームワークの固有のランタイム機能には、次のものがあります。

  • RESTリソースとの対話は、リソース、アクション実行、およびアクション実行の結果に対して、個別のJSONベース・メディア・タイプ構造によってサポートされています。

  • GET、POST、PATCH、DELETEなどの標準HTTPリクエスト・メソッドを使用してRESTリクエストと対話します。

  • クライアントでの制限によりRESTリソースとの対話に標準HTTPメソッドを使用できない場合は、POSTリクエスト・メソッドを使用するX-HTTP-Method-Overrideヘッダーを使用してHTTPメソッドを実行します。

  • RESTリソース・アイテム(特定の従業員など)やリソース・コレクション(すべての従業員のコレクションなど)の特定は、ADFビジネス・コンポーネント・モデル・プロジェクトで定義されているリソース名に基づくREST準拠のURIパス名によってサポートされます。

  • RESTリソースの記述(リソース・コレクション属性および使用可能なアクションなど)の取得は、特定のメディア・タイプとdescribeアクションでサポートされています。

  • 正規RESTリソースへのリンクは、更新可能エンティティのスーパーセットを持つリソースが定義されている場合にサポートされます。正規のリンクでは、基礎となるビュー・オブジェクトの代替リンクがサポートされます。

  • RESTリソースのフィルタ処理は、クライアントが特定のリソースにアクセスするために指定されたURIの問合せ文字列パラメータによりサポートされています。

  • 圧縮および解凍を有効化するために、エンコーディング形式がRESTリソースでサポートされています。

  • RESTリソースにより公開されるBLOB属性とCLOB属性のコンテンツのストリーミングは、ADF RESTフレームワークでサポートされています。

  • RESTful Webサービス起動時のデータ整合性チェックの実行は、ADF RESTフレームワークでサポートされています。この機能では、データベースのバージョン履歴を使用して、クライアントがリソース自体の更新に応じてHTTPペイロードを管理できるようにします。

  • ユーザーに対するRESTリソースへのアクセスの認可は、ADFセキュリティ権限の付与によって有効化されます。

ランタイム機能の可用性に影響を与えるADF RESTフレームワークの固有のデザインタイム機能には、次のものがあります。

  • URLリソース・パスのLOVアクセッサ・リンクを公開するために、リソースの基礎となるビュー・オブジェクトで値リスト(LOV)属性を定義します。

  • URLリソース・パスの行検索キー値を使用してリソースを検索するために、行検索を定義します。

  • HTTPメソッドでリクエスト・ペイロードを使用して起動可能なカスタム・アクションを公開するために、ビュー・クライアント・インタフェースまたはビュー行クライアント・インタフェースでクライアント・メソッドを定義します。

  • URLリソース・パスの正規のリンクを公開するために、更新可能属性のスーパーセットを使用してアプリケーション・データ・モデルのビュー・インスタンスを定義します。

  • サーバーのリソースにアクセスするリクエストを行う場合にデータ整合性チェックを有効化するために、リソースの基礎となるエンティティ・オブジェクトで更新識別子属性を構成します。

  • リソースで公開されているリンクを使用するコンテンツ・ストリーミングをサポートするために、リソースの基礎となるビュー・オブジェクトのBLOB属性またはCLOB属性でカスタム・コンテンツ・タイプを構成します。

  • リソースへのアクセスを許可する前にユーザーを認証するために、セキュリティを構成します。

22.1.2 RESTful Webサービスの追加機能

RESTful Webサービスを使用する前に、関連するOracle ADF機能を理解しておくと役立つ場合があります。次に、関連するサポート機能へのリンクを示します。

22.1.3 この章のリソース・サンプルについて

この章では、ADF RESTリソースとの対話およびADF RESTリソースの操作の一般的なユースケースについて説明します。すべてのサンプルは、Oracle HRスキーマのDEPARTMENTS表、EMPLOYEES表、JOBHISTORY表およびJOBS表に基づきます。図22-1は、ADFビジネス・コンポーネント・モデル・プロジェクトのこれらの表から生成されるビュー・オブジェクトを示しています。

図22-1 RESTサンプル・プロジェクト - ADFビジネス・コンポーネントのビュー・インスタンス

この図は周囲のテキストで説明しています

22.1.3.1 サンプル・プロジェクト・ファイルとデータ・モデル

図22-2に示すように、モデル・プロジェクトおよびそのプロジェクトで定義されたビジネス・コンポーネントには、ADF RESTリソース定義ファイルが含まれます。JDeveloperでは、JDeveloperでのリソースの実行とテストを有効化するためにRESTWebServiceプロジェクトも生成されます。

図22-2 RESTサンプル・アプリケーション - ADFビジネス・コンポーネント

この図は周囲のテキストで説明しています

図22-3に示すように、Departmentsリソースは、DepartmentsViewビュー・オブジェクトが基礎となっており、子リソースEmployeesが有効化されています。

図22-3 RESTサンプル・プロジェクト - アプリケーション・モジュールのデータ・モデル

この図は周囲のテキストで説明しています

22.1.3.2 サンプル・プロジェクト・リソースとリソース・バージョン識別子

図22-4に示すように、アプリケーションでは3つのバージョン・リリース名を定義します。各ADF RESTリソースは、これらのバージョン識別子のいずれかに割り当てられ、実行時にバージョン・リリース名でアクセスされます。たとえば、複数バージョンのEmployeesリソースが作成された場合、1つのバージョンではサポートされる操作セットが限定されており、もう一方のバージョンではより完全な操作セットが提供されます。

バージョン識別子の順序によりバージョンの順序が決まり、最新バージョンがリストの最上位に表示されることに注意してください。RESTサンプルでは、複数バージョンのEmployeesリソースが存在する場合、リリース名11.2が最新バージョンとして識別されます。

図22-4 RESTサンプル・プロジェクト - リソース・バージョン

この図は周囲のテキストで説明しています

図22-3に示すように、アプリケーション・モジュールは、作成されたリソースを、それらに割り当てられたバージョン・リリース名で編成します。Employeesリソースは、最初にバージョン11.0で作成され、それ以降のバージョン11.1および11.2では新しい必須属性を追加して改訂されます。11.1で追加されたJobsリソースでは、LOV有効属性を含むEmployeesリソースに対する作成操作がサポートされています。

図22-5 RESTサンプル・プロジェクト - アプリケーション・モジュール・リソース名

この図は周囲のテキストで説明しています

図22-6に示すように、DepartmentsリソースはDepartmentsViewビュー・オブジェクトが基礎となっており、子リソースEmployeesJobHistoryが有効化されています。

子リソースEmployeesの名前はビュー・リンク定義のリンク先ビュー・インスタンス名から導出されることに注意してください。このサンプルでは、リンク先ビュー・インスタンスの名前がEmployeesView1からEmployeesに変更されています。これにより、デフォルト名EmployeesView1ではなく名前EmployeesをURLリソース・パスで使用して子リソースにアクセスできます。

図22-6 RESTサンプル・プロジェクト - Departmentsリソース

この図は周囲のテキストで説明しています

図22-7に示すように、バージョン11.0Employeesルート・リソースは、EmployeesViewビュー・オブジェクトが基礎となっています。Employeesはルート・リソースとして作成されているため、子リソース・アクセッサを持ちません。

図22-7 RESTサンプル・プロジェクト - Employeesリソース・バージョン11.0

この図は周囲のテキストで説明しています

図22-8に示すように、EmployeesViewビュー・オブジェクトには、バージョン11.0Employeesルート・リソースで定義された複数のリソースがあります。HREmployeesリソースとBenefitsEmployeesリソースは、一意のビュー・オブジェクト形成定義が基礎となっており、これらの各リソースによりEmployeesリソースが正規リソースとして定義されます。

図22-8 RESTサンプル・プロジェクト - 正規Employeeリソース・バージョン11.0

この図は周囲のテキストで説明しています

図22-9に示すように、バージョン11.1Employeesルート・リソースでは、LOVが有効なEmployeesView属性JobIdJobsリソースを使用したリソース・アイテムの作成を有効にするCreate操作などの機能が追加されています。実行時に、Jobsリソースは、行のコンテキストを必要とせずに、LOV有効属性JobIdの値を指定します。このバージョンでは、Employeesリソース・コレクションでのサブタイプの使用も有効化されています(JobId属性がサブタイプ・リソースの識別子として機能します)。実行時に、Employeesリソースは、ジョブIDがSA_REP (販売責任者)の従業員のコミッション属性を表示します。

図22-9 RESTサンプル・プロジェクト - Employeesリソース・バージョン11.1

この図は周囲のテキストで説明しています

図22-10に示すように、バージョン11.2のEmployeesルート・リソースは、EmpByEmailFinder行検索を追加して、従業員を電子メール・アドレスで検索できるようにしています。

図22-10 RESTサンプル・プロジェクト - Employeesリソース・バージョン11.2

この図は周囲のテキストで説明しています

22.1.3.3 エンティティ・オブジェクトとビュー・オブジェクトのカスタマイズ

図22-11に示すように、EmployeesViewビュー・オブジェクトでは、LOV有効属性JobIdを定義します。LOVアクセッサ・リソースは、役職別のジョブ・リストを返し、対応するジョブIDの選択肢として示します。

JDeveloperでは、リソース定義で意図的にLOVアクセッサを公開しないことに注意してください。実行時に、ADF RESTランタイムは、リソース・アイテムのLOV有効属性の子としてLOVアクセッサ・リソースを自動的にネストします。

また、図22-11に、LOV有効属性が定義された新しいリソース・アイテムの作成のサポートを示します。EmployeesViewは、(v2:Jobsとして識別される)特定のバージョンのLOVアクセッサ・リソースを、LOV有効属性JobIdに関連付けます。実行時に、Employeesリソースの記述により、LOVリソースへのリンクが公開されます。

図22-11 RESTサンプル・プロジェクト - Employees LOV有効属性

img/GUID-7436F317-FB7E-452C-B466-CF1D9C89EB4C-default.png

図22-12に示すように、EmployeesViewビュー・オブジェクトは、EmpByEmailFinder行検索を定義します。行検索では、従業員IDではなく従業員の電子メール・アドレス(Email属性)を使用して従業員を取得します。

行検索は、デフォルトですべてのバージョンのリソースで公開されることに注意してください。ただし、行検索キー属性が特定のリソース定義で定義されている場合は、その検索名をURLリソース・パスで使用する必要があります。行検索キーがリソース定義で明示的に定義されるまでは、URLリソース・パスでキー属性(このサンプルではEmployeeId)が必要となります。

図22-12 RESTサンプル・プロジェクト - Employees行検索

この図は周囲のテキストで説明しています

図22-13に示すように、EmployeesViewビュー・オブジェクトでは、Picture属性でカスタム・コンテンツ・タイプimage/pngを定義します。このコンテンツ・タイプにより、属性のデフォルトのapplication/octet-streamコンテンツ・タイプ定義が置換され、イメージ・コンテンツのストリーミング時に期待される受入れタイプになります。

図22-13 RESTサンプル・プロジェクト - Employees BLOBコンテンツ・タイプ

この図は周囲のテキストで説明しています

図22-14に示すように、EmployeesViewビュー・オブジェクトでは、Employeesリソースで使用するカスタム・サービス・メソッドmultiplySalaryを定義します。このメソッドはビュー行インタフェースで定義されているため、リソース・コレクション(すべての従業員)ではなくリソース・アイテム(特定の従業員)のレベルでカスタム・アクションとして公開されます。ビュー・オブジェクト・クライアント・インタフェースで定義されているメソッドのみが、リソース・コレクションに対して機能します。

図22-14 RESTサンプル・プロジェクト - Employeesビュー行インタフェース・カスタム・メソッド

この図は周囲のテキストで説明しています

図22-15に示すように、Departmentsエンティティ・オブジェクトでは、データ整合性チェックを有効化する更新識別子属性RelStateを定義します。属性のエディタでは、更新識別子を構成するために「更新識別子」フィールドと「履歴列」 - 「バージョン番号」フィールドが有効になっています。

図22-15 RESTサンプル・プロジェクト - Departments更新識別子属性

この図は周囲のテキストで説明しています

22.2 ADFビジネス・コンポーネントのリソースの理解

サービス開発者がADFビジネス・コンポーネント・モデル・プロジェクトで作成するADF RESTリソースは、プロジェクト・アプリケーション・モジュールで定義されたビュー・オブジェクト・インスタンスに基づきます。次に例を示します。
  • Departmentsリソースは、DepartmentsVOビュー・インスタンス、およびEmployeesVOビュー・インスタンスへのアクセッサに基づきます。

  • Employeesリソースは、EmployeesVOビュー・インスタンスに基づきます。

実行時に、RESTful Webサービスのアクションが起動されると、サービスにより返されるペイロードには1つ以上のリソース・コレクションが含まれ、基礎となるビュー・オブジェクトにより問合せが行われる行セット、およびビュー・オブジェクト行の個々の属性で構成されます。リソース・コレクションでは、マスター/ディテール調整ビュー・インスタンスの関係が維持されます。

表22-1に示すように、リソース・コレクションは、ビュー・オブジェクト・インスタンスのRESTful Webサービス・ペイロード表現です。リソース・アイテムは、ペイロード・アイテム・オブジェクトの行および属性で、ビュー・オブジェクト行に対応します。

注意:

ADFリソース・コレクションおよび含まれているアイテムの形式は、特定のADF RESTメディア・タイプによりJSONエンコード・エンティティとして定義されます。詳細は、「ADF RESTメディア・タイプ」を参照してください。


表22-1 JSONオブジェクトおよびADFビジネス・コンポーネント表現

JSONオブジェクト ADFビジネス・コンポーネント

resource collection

1つ以上の行で構成されるビュー・オブジェクト・インスタンス。DepartmentsEmployeesは、DepartmentsVOビュー・インスタンスとEmployeesVOビュー・インスタンスに基づくリソース・コレクションの例です。

resource item

ビュー・オブジェクト行。特定の部門10または従業員1012は、Departmentsリソース・コレクションとEmployeesリソース・コレクションのリソース・アイテムの例です。


22.3 ADF RESTリソースの記述の取得

RESTful Webサービスの記述により、ADF RESTful Webサービスで許可されている形状とアクションを識別できます。RESTリソース定義で定義されている属性、アクションおよびリンクを含むJSONオブジェクトを返します。

ADF RESTフレームワークでは、サービス・エンドポイントに関して次の記述のユースケースをサポートしています。

  • 使用可能なすべてのリソース(リソース・カタログ)を記述します。

  • 単一のリソース・コレクションを記述します。

  • 単一のリソース・アイテムを記述します。

  • 親子関係でのネストされたリソースを記述します。

記述を取得するには、/describeをリソースURLに追加して、HTTP GETを起動します。

注意:

GETリクエストを実行してリソースの記述を取得する場合、クライアントが特定バージョンのコンテキストにあることも必要となります。サービス・エンドポイントのバージョン・リリース名の取得方法の詳細は、「リソース・バージョンの取得」を参照してください。

たとえば、次のURLは、識別されたアプリケーションのバージョン11.0Employeesリソースに関する記述を返します。

http://host:port/context-root/rest/11.0/Employees/describe

アプリケーションの特定バージョンのすべてのリソースの記述を取得するには、/describeをバージョンURLに追加します。

たとえば、次のURLは、識別されたアプリケーションのバージョン11.0のすべてのリソースに関する記述を返します。

http://host:port/context-root/rest/11.0/describe

22.3.1 使用可能なすべてのリソースの記述

ADF RESTランタイムでは、GETメソッドを使用した、アプリケーション・エンド・ポイントの使用可能なすべてのリソースの記述をサポートしています。

リソース・カタログ内の使用可能なすべてのリソースを調査する手順は次のとおりです。

  1. リソース・カタログの記述を実行し、その記述内でリソースの名前を検索します。children属性により、ネストされたリソースを識別します。

  2. これらのリソース・オブジェクトを調査して、各リソースの形状を理解します。

    • attributesでは、使用可能なリソース・コレクション属性のリストを指定します。

    • collectionでは、コレクションの形状を指定し、finder (行検索の場合)、links、および使用可能なactions (メディア・タイプを含む)を指定します。

    • itemでは、コレクションのインスタンスの形状を指定し、item自体ではlinksと使用可能なactionsを指定します。

    • childrenでは、ネストされたリソースを指定します(children自体にはattributesオブジェクト、collectionオブジェクトおよびitemオブジェクトが含まれます)。

たとえば、Departmentsリソースと子Employeesリソースを含むサービスの記述は、次のオブジェクトを返します。

{
  "Resources" : {
    "Employees" : {
      "discrColumnType" : false,
      "attributes" : [ {
       ...
      } ],
      "collection" : {
        ...
        } ],
        "finders" : [ {
        } ]
        "links" : [ {
        } ]
        "actions" : [ {
        } ]
      },
      "item" : {
        "links" : [ {
        } ]
        "actions" : [ {
        } ]
      },
      "children" : {
        "Departments"
          ...
        } ],
      ...
      "links" : [ {
      } ]
  }
}

次のサンプルは、リソース・カタログ内のバージョン11.0のすべてのリソースを記述します。URLバージョン・パラメータ11.0は、アプリケーション固有のバージョン識別子に置き換えられる場合があることに注意してください。リソース・バージョンの指定の詳細は、「リソース・バージョンの取得」を参照してください。

リクエスト

  • URL

    http://server/demo/rest/11.0/describe

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.description+json

  • ペイロード

    {
      "Resources" : {
        "Employees" : {
          "discrColumnType" : false,
          "attributes" : [ {
            "name" : "EmployeeId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 6
          }, {
            "name" : "FirstName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 20
          }, {
            "name" : "LastName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "Email",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "JobId",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 10,
            "controlType" : "choice",
            "maxLength" : "10",
            "lov" : {
              "childRef" : "JobsLOV",
              "attributeMap" : [ {
                "source" : "JobTitle",
                "target" : "JobId"
              } ],
              "displayAttributes" : [ "JobTitle" ]
            }
          }, {
            "name" : "DepartmentId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 4
          }, {
            "name" : "Salary",
            "type" : "number",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 8,
            "scale" : 2
          }, {
            "name" : "Picture",
            "type" : "attachment",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : false,
            "actions" : [ {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "image/png" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            }, {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "image/png" ]
            } ]
          } ],
          "collection" : {
            "rangeSize" : 24,
            "finders" : [ {
              "name" : "EmpByEmailFinder",
              "title" : "EmployeesByEmailVC",
              "attributes" : [ {
                "name" : "Email",
                "type" : "string",
                "updatable" : true,
                "required" : "Optional",
                "queryable" : false
              } ]
            }, {
              "name" : "PrimaryKey",
              "attributes" : [ {
                "name" : "EmployeeId",
                "type" : "integer",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 6
              } ]
            } ],
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Employees",
              "name" : "self",
              "kind" : "collection"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourcecollection+json" ]
            }, {
              "name" : "create",
              "method" : "POST",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            } ]
          },
          "item" : {
            "links" : [ {
              "rel" : "lov",
              "href" : "http://server/demo/rest/11.0/Employees/{id}/lov/JobsLOV",
              "name" : "JobsLOV",
              "kind" : "collection"
            }, {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Employees/{id}",
              "name" : "self",
              "kind" : "item"
            }, {
              "rel" : "canonical",
              "href" : "http://server/demo/rest/11.0/Employees/{id}",
              "name" : "canonical",
              "kind" : "item"
            }, {
              "rel" : "enclosure",
              "href" : "http://server/demo/rest/11.0/Employees/enclosure/Picture",
              "name" : "Picture",
              "kind" : "other"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            }, {
              "name" : "multiplySalary",
              "parameters" : [ {
                "name" : "multiplicand",
                "type" : "number",
                "mandatory" : false
              } ],
              "resultType" : "number",
              "method" : "POST",
              "requestType" : [ "application/vnd.oracle.adf.action+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.actionresult+json" ]
            } ]
          },
          "children" : {
            "JobsLOV" : {
              "discrColumnType" : false,
              "attributes" : [ {
                "name" : "JobId",
                "type" : "string",
                "updatable" : false,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 10
              }, {
                "name" : "JobTitle",
                "type" : "string",
                "updatable" : false,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 35
              }, {
                "name" : "MinSalary",
                "type" : "integer",
                "updatable" : false,
                "mandatory" : false,
                "queryable" : true,
                "precision" : 6
              }, {
                "name" : "MaxSalary",
                "type" : "integer",
                "updatable" : false,
                "mandatory" : false,
                "queryable" : true,
                "precision" : 6
              } ],
              "collection" : {
                "rangeSize" : 0,
                "finders" : [ {
                  "name" : "PrimaryKey",
                  "attributes" : [ {
                    "name" : "JobId",
                    "type" : "string",
                    "updatable" : false,
                    "mandatory" : true,
                    "queryable" : true,
                    "precision" : 10
                  } ]
                } ],
                "links" : [ {
                  "rel" : "self",
                  "href" : "http://server/demo/rest/11.0/Employees/{id}/child/JobsLOV",
                  "name" : "self",
                  "kind" : "collection"
                } ],
                "actions" : [ {
                  "name" : "get",
                  "method" : "GET",
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourcecollection+json" ]
                }, {
                  "name" : "create",
                  "method" : "POST",
                  "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                } ]
              },
              "item" : {
                "links" : [ {
                  "rel" : "self",
                  "href" : "http://server/demo/rest/11.0/Employees/{id}/child/JobsLOV/{id}",
                  "name" : "self",
                  "kind" : "item"
                }, {
                  "rel" : "parent",
                  "href" : "http://server/demo/rest/11.0/Employees/{id}",
                  "name" : "parent",
                  "kind" : "item"
                }, {
                  "rel" : "canonical",
                  "href" : "http://server/demo/rest/11.0/Employees/{id}/child/JobsLOV/{id}",
                  "name" : "canonical",
                  "kind" : "item"
                } ],
                "actions" : [ {
                  "name" : "get",
                  "method" : "GET",
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                }, {
                  "name" : "update",
                  "method" : "PATCH",
                  "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                }, {
                  "name" : "replace",
                  "method" : "PUT",
                  "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                }, {
                  "name" : "delete",
                  "method" : "DELETE"
                } ]
              },
              "links" : [ {
                "rel" : "self",
                "href" : "http://server/demo/rest/11.0/Employees/{id}/child/JobsLOV/describe",
                "name" : "self",
                "kind" : "describe"
              }, {
                "rel" : "canonical",
                "href" : "http://server/demo/rest/11.0/Employees/{id}/child/JobsLOV/describe",
                "name" : "canonical",
                "kind" : "describe"
              } ]
            }
          },
          "links" : [ {
            "rel" : "self",
            "href" : "http://server/demo/rest/11.0/Employees/describe",
            "name" : "self",
            "kind" : "describe"
          }, {
            "rel" : "canonical",
            "href" : "http://server/demo/rest/11.0/Employees/describe",
            "name" : "canonical",
            "kind" : "describe"
          } ]
        },
        "Departments" : {
          "discrColumnType" : false,
          "attributes" : [ {
            "name" : "DepartmentId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 4
          }, {
            "name" : "DepartmentName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 30
          }, {
            "name" : "RelState",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true
          } ],
          "collection" : {
            "rangeSize" : 24,
            "finders" : [ {
              "name" : "PrimaryKey",
              "attributes" : [ {
                "name" : "DepartmentId",
                "type" : "integer",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 4
              } ]
            } ],
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Departments",
              "name" : "self",
              "kind" : "collection"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourcecollection+json" ]
            }, {
              "name" : "create",
              "method" : "POST",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "testImpl",
              "parameters" : [ {
                "name" : "testid",
                "type" : "string",
                "mandatory" : false
              } ],
              "resultType" : "string",
              "method" : "POST",
              "requestType" : [ "application/vnd.oracle.adf.action+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.actionresult+json" ]
            } ]
          },
          "item" : {
            "links" : [ {
              "rel" : "child",
              "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees",
              "name" : "Employees",
              "kind" : "collection",
              "cardinality" : {
                "value" : "1 to *",
                "sourceAttributes" : "DepartmentId",
                "destinationAttributes" : "DepartmentId"
              }
            }, {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Departments/{id}",
              "name" : "self",
              "kind" : "item"
            }, {
              "rel" : "canonical",
              "href" : "http://server/demo/rest/11.0/Departments/{id}",
              "name" : "canonical",
              "kind" : "item"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "update",
              "method" : "PATCH",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            } ]
          },
          "children" : {
            "Employees" : {
              "discrColumnType" : false,
              "attributes" : [ {
                "name" : "EmployeeId",
                "type" : "integer",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 6
              }, {
                "name" : "FirstName",
                "type" : "string",
                "updatable" : true,
                "mandatory" : false,
                "queryable" : true,
                "precision" : 20
              }, {
                "name" : "LastName",
                "type" : "string",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 25
              }, {
                "name" : "Email",
                "type" : "string",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 25
              }, {
                "name" : "JobId",
                "type" : "string",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 10,
                "controlType" : "choice",
                "maxLength" : "10",
                "lov" : {
                  "childRef" : "JobsLOV",
                  "attributeMap" : [ {
                    "source" : "JobTitle",
                    "target" : "JobId"
                  } ],
                  "displayAttributes" : [ "JobTitle" ]
                }
              }, {
                "name" : "DepartmentId",
                "type" : "integer",
                "updatable" : true,
                "mandatory" : false,
                "queryable" : true,
                "precision" : 4
              }, {
                "name" : "Salary",
                "type" : "number",
                "updatable" : true,
                "mandatory" : false,
                "queryable" : true,
                "precision" : 8,
                "scale" : 2
              }, {
                "name" : "Picture",
                "type" : "attachment",
                "updatable" : true,
                "mandatory" : false,
                "queryable" : false,
                "actions" : [ {
                  "name" : "replace",
                  "method" : "PUT",
                  "requestType" : [ "image/png" ]
                }, {
                  "name" : "delete",
                  "method" : "DELETE"
                }, {
                  "name" : "get",
                  "method" : "GET",
                  "responseType" : [ "image/png" ]
                } ]
              } ],
              "collection" : {
                "rangeSize" : 0,
                "finders" : [ {
                  "name" : "EmpByEmailFinder",
                  "title" : "EmployeesByEmailVC",
                  "attributes" : [ {
                    "name" : "Email",
                    "type" : "string",
                    "updatable" : true,
                    "required" : "Optional",
                    "queryable" : false
                  } ]
                }, {
                  "name" : "PrimaryKey",
                  "attributes" : [ {
                    "name" : "EmployeeId",
                    "type" : "integer",
                    "updatable" : true,
                    "mandatory" : true,
                    "queryable" : true,
                    "precision" : 6
                  } ]
                } ],
                "links" : [ {
                  "rel" : "self",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees",
                  "name" : "self",
                  "kind" : "collection"
                } ],
                "actions" : [ {
                  "name" : "get",
                  "method" : "GET",
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourcecollection+json" ]
                }, {
                  "name" : "create",
                  "method" : "POST",
                  "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                } ]
              },
              "item" : {
                "links" : [ {
                  "rel" : "self",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/{id}",
                  "name" : "self",
                  "kind" : "item"
                }, {
                  "rel" : "parent",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}",
                  "name" : "parent",
                  "kind" : "item"
                }, {
                  "rel" : "canonical",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/{id}",
                  "name" : "canonical",
                  "kind" : "item"
                }, {
                  "rel" : "enclosure",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/{id}/enclosure/Picture",
                  "name" : "Picture",
                  "kind" : "other"
                } ],
                "actions" : [ {
                  "name" : "get",
                  "method" : "GET",
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                }, {
                  "name" : "update",
                  "method" : "PATCH",
                  "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                }, {
                  "name" : "replace",
                  "method" : "PUT",
                  "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                }, {
                  "name" : "delete",
                  "method" : "DELETE"
                }, {
                  "name" : "multiplySalary",
                  "parameters" : [ {
                    "name" : "multiplicand",
                    "type" : "number",
                    "mandatory" : false
                  } ],
                  "resultType" : "number",
                  "method" : "POST",
                  "requestType" : [ "application/vnd.oracle.adf.action+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.actionresult+json" ]
                } ]
              },
              "links" : [ {
                "rel" : "self",
                "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/describe",
                "name" : "self",
                "kind" : "describe"
              }, {
                "rel" : "canonical",
                "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/describe",
                "name" : "canonical",
                "kind" : "describe"
              } ]
            }
          },
          "links" : [ {
            "rel" : "self",
            "href" : "http://server/demo/rest/11.0/Departments/describe",
            "name" : "self",
            "kind" : "describe"
          }, {
            "rel" : "canonical",
            "href" : "http://server/demo/rest/11.0/Departments/describe",
            "name" : "canonical",
            "kind" : "describe"
          } ]
        }
      }
    }
    

22.3.2 リソース・コレクションの記述

ADF RESTランタイムでは、GETメソッドを使用したリソース・コレクションの記述をサポートしています。

リソース・コレクションを調査する手順は次のとおりです。

  1. リソース・コレクションの記述を実行し、その記述内でリソースの名前を検索します。

  2. これらのリソース・オブジェクトを調査して、各リソースの形状を理解します。

    • attributesでは、使用可能なリソース・コレクション属性のリストを指定します。

    • collectionでは、コレクションの形状を指定し、finder (行検索の場合)、links、および使用可能なactions (メディア・タイプを含む)を指定します。

    • itemでは、コレクションのインスタンスの形状を指定し、item自体ではlinksと使用可能なactionsを指定します。

    • childrenでは、ネストされたリソースを指定します(children自体にはattributesオブジェクト、collectionオブジェクトおよびitemオブジェクトが含まれます)。

たとえば、Departmentsリソースの記述は、次のオブジェクトを返します。

{
  "Resources" : {
    "Departments" : {
      "discrColumnType" : false,
      "attributes" : [ {
       ...
      } ],
      "collection" : {
        ...
        } ],
        "finders" : [ {
        } ]
        "links" : [ {
        } ]
        "actions" : [ {
        } ]
      },
      "item" : {
        "links" : [ {
        } ]
        "actions" : [ {
        } ]
      },
      "children" : {
        "Employees"
          ...
        } ],
      ...
      "links" : [ {
      } ]
  }
}

次のサンプルは、バージョン11.0Departmentsリソースを記述します。

リクエスト

  • URL

    http://server/demo/rest/11.0/Departments/describe

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.description+json

  • ペイロード

    {
      "Resources" : {
        "Departments" : {
          "discrColumnType" : false,
          "attributes" : [ {
            "name" : "DepartmentId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 4
          }, {
            "name" : "DepartmentName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 30
          }, {
            "name" : "RelState",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true
          } ],
          "collection" : {
            "rangeSize" : 25,
            "finders" : [ {
              "name" : "PrimaryKey",
              "attributes" : [ {
                "name" : "DepartmentId",
                "type" : "integer",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 4
              } ]
            } ],
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Departments",
              "name" : "self",
              "kind" : "collection"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourcecollection+json" ]
            }, {
              "name" : "create",
              "method" : "POST",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "testImpl",
              "parameters" : [ {
                "name" : "testid",
                "type" : "string",
                "mandatory" : false
              } ],
              "resultType" : "string",
              "method" : "POST",
              "requestType" : [ "application/vnd.oracle.adf.action+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.actionresult+json" ]
            } ]
          },
          "item" : {
            "links" : [ {
              "rel" : "child",
              "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees",
              "name" : "Employees",
              "kind" : "collection",
              "cardinality" : {
                "value" : "1 to *",
                "sourceAttributes" : "DepartmentId",
                "destinationAttributes" : "DepartmentId"
              }
            }, {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Departments/{id}",
              "name" : "self",
              "kind" : "item"
            }, {
              "rel" : "canonical",
              "href" : "http://server/demo/rest/11.0/Departments/{id}",
              "name" : "canonical",
              "kind" : "item"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "update",
              "method" : "PATCH",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            } ]
          },
          "children" : {
            "Employees" : {
              "discrColumnType" : false,
              "attributes" : [ {
                "name" : "EmployeeId",
                "type" : "integer",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 6
              }, {
                "name" : "FirstName",
                "type" : "string",
                "updatable" : true,
                "mandatory" : false,
                "queryable" : true,
                "precision" : 20
              }, {
                "name" : "LastName",
                "type" : "string",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 25
              }, {
                "name" : "Email",
                "type" : "string",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 25
              }, {
                "name" : "JobId",
                "type" : "string",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 10,
                "controlType" : "choice",
                "maxLength" : "10",
                "lov" : {
                  "childRef" : "JobsLOV",
                  "attributeMap" : [ {
                    "source" : "JobTitle",
                    "target" : "JobId"
                  } ],
                  "displayAttributes" : [ "JobTitle" ]
                }
              }, {
                "name" : "DepartmentId",
                "type" : "integer",
                "updatable" : true,
                "mandatory" : false,
                "queryable" : true,
                "precision" : 4
              }, {
                "name" : "Salary",
                "type" : "number",
                "updatable" : true,
                "mandatory" : false,
                "queryable" : true,
                "precision" : 8,
                "scale" : 2
              }, {
                "name" : "Picture",
                "type" : "attachment",
                "updatable" : true,
                "mandatory" : false,
                "queryable" : false,
                "actions" : [ {
                  "name" : "replace",
                  "method" : "PUT",
                  "requestType" : [ "image/png" ]
                }, {
                  "name" : "delete",
                  "method" : "DELETE"
                }, {
                  "name" : "get",
                  "method" : "GET",
                  "responseType" : [ "image/png" ]
                } ]
              } ],
              "collection" : {
                "rangeSize" : 0,
                "finders" : [ {
                  "name" : "EmpByEmailFinder",
                  "title" : "EmployeesByEmailVC",
                  "attributes" : [ {
                    "name" : "Email",
                    "type" : "string",
                    "updatable" : true,
                    "required" : "Optional",
                    "queryable" : false
                  } ]
                }, {
                  "name" : "PrimaryKey",
                  "attributes" : [ {
                    "name" : "EmployeeId",
                    "type" : "integer",
                    "updatable" : true,
                    "mandatory" : true,
                    "queryable" : true,
                    "precision" : 6
                  } ]
                } ],
                "links" : [ {
                  "rel" : "self",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees",
                  "name" : "self",
                  "kind" : "collection"
                } ],
                "actions" : [ {
                  "name" : "get",
                  "method" : "GET",
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourcecollection+json" ]
                }, {
                  "name" : "create",
                  "method" : "POST",
                  "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                } ]
              },
              "item" : {
                "links" : [ {
                  "rel" : "self",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/{id}",
                  "name" : "self",
                  "kind" : "item"
                }, {
                  "rel" : "parent",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}",
                  "name" : "parent",
                  "kind" : "item"
                }, {
                  "rel" : "canonical",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/{id}",
                  "name" : "canonical",
                  "kind" : "item"
                }, {
                  "rel" : "enclosure",
                  "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/{id}/enclosure/Picture",
                  "name" : "Picture",
                  "kind" : "other"
                } ],
                "actions" : [ {
                  "name" : "get",
                  "method" : "GET",
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                }, {
                  "name" : "update",
                  "method" : "PATCH",
                  "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                }, {
                  "name" : "replace",
                  "method" : "PUT",
                  "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
                }, {
                  "name" : "delete",
                  "method" : "DELETE"
                }, {
                  "name" : "multiplySalary",
                  "parameters" : [ {
                    "name" : "multiplicand",
                    "type" : "number",
                    "mandatory" : false
                  } ],
                  "resultType" : "number",
                  "method" : "POST",
                  "requestType" : [ "application/vnd.oracle.adf.action+json" ],
                  "responseType" : [ "application/json", "application/vnd.oracle.adf.actionresult+json" ]
                } ]
              },
              "links" : [ {
                "rel" : "self",
                "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/describe",
                "name" : "self",
                "kind" : "describe"
              }, {
                "rel" : "canonical",
                "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees/describe",
                "name" : "canonical",
                "kind" : "describe"
              } ]
            }
          },
          "links" : [ {
            "rel" : "self",
            "href" : "http://server/demo/rest/11.0/Departments/describe",
            "name" : "self",
            "kind" : "describe"
          }, {
            "rel" : "canonical",
            "href" : "http://server/demo/rest/11.0/Departments/describe",
            "name" : "canonical",
            "kind" : "describe"
          } ]
        }
      }
    }
    

22.3.3 リソース・アイテムの記述

ADF RESTランタイムでは、GETメソッドを使用したリソース・アイテムの記述をサポートしています。

リソース・アイテムの記述は、通常、コレクションの記述と同じ情報を提供することに注意してください。ただし、多相コレクションの場合、リソース・アイテムの記述には、リソース・コレクションの記述よりも多くの情報が含まれます。たとえば、(車両リソースに自動車アイテムと航空機アイテムが含まれる)多相コレクション車両について考えてみます。車両の記述は、すべての車両の一般的な形状を返し、自動車リソース・アイテムの記述はそのオブジェクト固有の形状を返します。

リソース・アイテムを調査する手順は次のとおりです。

  1. リソース・アイテムの記述を実行し、その記述内でリソースの名前を検索します。children属性により、ネストされたリソースを識別します。

  2. リソース・アイテムの記述を調査して、その形状を理解します。

    • attributesでは、使用可能なリソース・コレクション属性のリストを指定します。

    • itemでは、アイテム(定義された子コレクションなど)へのlinks、および使用可能なactionsを指定します。

    • linksでは、記述のリンクを指定します。

たとえば、Departmentsリソース・アイテムの記述は、次のオブジェクトを返します。

{
  "Resources" : {
    "Departments" : {
      "discrColumnType" : false,
      "attributes" : [ {
       ...
      } ],
      "item" : {
        "links" : [ {
        } ]
        "actions" : [ {
        } ]
      },
      "links" : [ {
      } ]
  }
}

次のサンプルは、バージョン11.0Departmentsリソース・コレクションのインスタンスを記述します。

リクエスト

  • URL

    http://server/demo/rest/11.0/Departments/10/describe

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.description+json

  • ペイロード

    {
      "Resources" : {
        "Departments" : {
          "discrColumnType" : false,
          "attributes" : [ {
            "name" : "DepartmentId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 4
          }, {
            "name" : "DepartmentName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 30
          }, {
            "name" : "RelState",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true
          } ],
          "item" : {
            "links" : [ {
              "rel" : "child",
              "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
              "name" : "Employees",
              "kind" : "collection",
              "cardinality" : {
                "value" : "1 to *",
                "sourceAttributes" : "DepartmentId",
                "destinationAttributes" : "DepartmentId"
              }
            }, {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Departments/10",
              "name" : "self",
              "kind" : "item"
            }, {
              "rel" : "canonical",
              "href" : "http://server/demo/rest/11.0/Departments/10",
              "name" : "canonical",
              "kind" : "item"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "update",
              "method" : "PATCH",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            } ]
          },
          "links" : [ {
            "rel" : "self",
            "href" : "http://server/demo/rest/11.0/Departments/10/describe",
            "name" : "self",
            "kind" : "describe"
          }, {
            "rel" : "canonical",
            "href" : "http://server/demo/rest/11.0/Departments/10/describe",
            "name" : "canonical",
            "kind" : "describe"
          } ]
        }
      }
    }
    

22.3.4 ネストされたリソースの記述

ADF RESTランタイムでは、GETメソッドを使用した、ADF RESTのネストされたリソースの記述をサポートしています。

リソース・カタログ内のネストされたリソースを調査する手順は次のとおりです。

  1. ネストされたリソースの記述を実行し、その記述内でリソースの名前を検索します。children属性により、ネストされたリソースを識別します。

  2. これらのリソース・オブジェクトを調査して、各リソースの形状を理解します。

    • attributesでは、使用可能なリソース・コレクション属性のリストを指定します。

    • collectionでは、コレクションの形状を指定し、finder (行検索の場合)、links、および使用可能なactions (メディア・タイプを含む)を指定します。

    • itemでは、コレクションのインスタンスの形状を指定し、item自体ではlinksと使用可能なactionsを指定します。

    • childrenでは、ネストされたリソースを指定します(children自体にはattributesオブジェクト、collectionオブジェクトおよびitemオブジェクトが含まれます)。

たとえば、ネストされたリソースDepartmentsとリソースEmployeesの記述は、次のオブジェクトを返します。

{
  "Resources" : {
    "Employees" : {
      "discrColumnType" : false,
      "attributes" : [ {
       ...
      } ],
      "collection" : {
        ...
        } ],
        "finders" : [ {
        } ]
        "links" : [ {
        } ]
        "actions" : [ {
        } ]
      },
      "item" : {
        "links" : [ {
        } ]
        "actions" : [ {
        } ]
      },
      "children" : {
        "Departments"
          ...
        } ],
      ...
      "links" : [ {
      } ]
  }
}

次のサンプル(URL1)は、Departmentのコンテキストで見つけることができるバージョン11.0Employeesリソースを記述します。2番目のサンプル(URL2)は、ネストされた同じリソースEmployeesのアイテムを記述します(ネストされたリソース・アイテムは従業員のIDにより識別されます)。

リクエスト

  • URL 1

    http://server/demo/rest/11.0/Departments/10/child/Employees/describe

  • URL 2

    http://server/demo/rest/11.0/Departments/10/child/Employees/200/describe

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.description+json

  • ペイロード 1

    {
      "Resources" : {
        "Employees" : {
          "discrColumnType" : false,
          "attributes" : [ {
            "name" : "EmployeeId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 6
          }, {
            "name" : "FirstName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 20
          }, {
            "name" : "LastName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "Email",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "JobId",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 10,
            "controlType" : "choice",
            "maxLength" : "10",
            "lov" : {
              "childRef" : "JobsLOV",
              "attributeMap" : [ {
                "source" : "JobTitle",
                "target" : "JobId"
              } ],
              "displayAttributes" : [ "JobTitle" ]
            }
          }, {
            "name" : "DepartmentId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 4
          }, {
            "name" : "Salary",
            "type" : "number",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 8,
            "scale" : 2
          }, {
            "name" : "Picture",
            "type" : "attachment",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : false,
            "actions" : [ {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "image/png" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            }, {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "image/png" ]
            } ]
          } ],
          "collection" : {
            "rangeSize" : 25,
            "finders" : [ {
              "name" : "EmpByEmailFinder",
              "title" : "EmployeesByEmailVC",
              "attributes" : [ {
                "name" : "Email",
                "type" : "string",
                "updatable" : true,
                "required" : "Optional",
                "queryable" : false
              } ]
            }, {
              "name" : "PrimaryKey",
              "attributes" : [ {
                "name" : "EmployeeId",
                "type" : "integer",
                "updatable" : true,
                "mandatory" : true,
                "queryable" : true,
                "precision" : 6
              } ]
            } ],
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
              "name" : "self",
              "kind" : "collection"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourcecollection+json" ]
            }, {
              "name" : "create",
              "method" : "POST",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            } ]
          },
          "item" : {
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/{id}",
              "name" : "self",
              "kind" : "item"
            }, {
              "rel" : "parent",
              "href" : "http://server/demo/rest/11.0/Departments/10",
              "name" : "parent",
              "kind" : "item"
            }, {
              "rel" : "canonical",
              "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/{id}",
              "name" : "canonical",
              "kind" : "item"
            }, {
              "rel" : "enclosure",
              "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/enclosure/Picture",
              "name" : "Picture",
              "kind" : "other"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "update",
              "method" : "PATCH",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            }, {
              "name" : "multiplySalary",
              "parameters" : [ {
                "name" : "multiplicand",
                "type" : "number",
                "mandatory" : false
              } ],
              "resultType" : "number",
              "method" : "POST",
              "requestType" : [ "application/vnd.oracle.adf.action+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.actionresult+json" ]
            } ]
          },
          "links" : [ {
            "rel" : "self",
            "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/describe",
            "name" : "self",
            "kind" : "describe"
          }, {
            "rel" : "canonical",
            "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/describe",
            "name" : "canonical",
            "kind" : "describe"
          } ]
        }
      }
    }
    
  • ペイロード 2

    {
      "Resources" : {
        "Employees" : {
          "discrColumnType" : false,
          "attributes" : [ {
            "name" : "EmployeeId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 6
          }, {
            "name" : "FirstName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 20
          }, {
            "name" : "LastName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "Email",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "JobId",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 10,
            "controlType" : "choice",
            "maxLength" : "10",
            "lov" : {
              "childRef" : "JobsLOV",
              "attributeMap" : [ {
                "source" : "JobTitle",
                "target" : "JobId"
              } ],
              "displayAttributes" : [ "JobTitle" ]
            }
          }, {
            "name" : "DepartmentId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 4
          }, {
            "name" : "Salary",
            "type" : "number",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 8,
            "scale" : 2
          }, {
            "name" : "Picture",
            "type" : "attachment",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : false,
            "actions" : [ {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "image/png" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            }, {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "image/png" ]
            } ]
          } ],
          "item" : {
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/200",
              "name" : "self",
              "kind" : "item"
            }, {
              "rel" : "parent",
              "href" : "http://server/demo/rest/11.0/Departments/10",
              "name" : "parent",
              "kind" : "item"
            }, {
              "rel" : "canonical",
              "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/200",
              "name" : "canonical",
              "kind" : "item"
            }, {
              "rel" : "enclosure",
              "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/200/enclosure/Picture",
              "name" : "Picture",
              "kind" : "other"
            } ],
            "actions" : [ {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "update",
              "method" : "PATCH",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "application/vnd.oracle.adf.resourceitem+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.resourceitem+json" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            }, {
              "name" : "multiplySalary",
              "parameters" : [ {
                "name" : "multiplicand",
                "type" : "number",
                "mandatory" : false
              } ],
              "resultType" : "number",
              "method" : "POST",
              "requestType" : [ "application/vnd.oracle.adf.action+json" ],
              "responseType" : [ "application/json", "application/vnd.oracle.adf.actionresult+json" ]
            } ]
          },
          "links" : [ {
            "rel" : "self",
            "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/200/describe",
            "name" : "self",
            "kind" : "describe"
          }, {
            "rel" : "canonical",
            "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees/200/describe",
            "name" : "canonical",
            "kind" : "describe"
          } ]
        }
      }
    }
    

22.3.5 ADF RESTの記述内のlinksオブジェクト構造の理解

linksは、値が常にURLリンクとなるJSONオブジェクトであり、リンク名はそのリンクのrelに応じて定義されます。linksオブジェクトは、各リソース・コレクション、リソース・アイテムおよびリソース自体に対して生成されます。

リソースの記述内のURLリンクは、そのURLのすべての部分を決定する十分な情報がない場合、テンプレート・プレースホルダ値({id})を使用して生成されることに注意してください。たとえば、次の子リンクは、特定のDepartmentリソースの値のプレースホルダを含むURLを提供します。

"item" : {
     "links" : [ {
        "rel" : "child",
        "href" : "http://server/demo/rest/11.0/Departments/{id}/child/Employees",
        "name" : "Employees",
        "kind" : "collection",
        "cardinality" : {
          "value" : "1 to *",
          "sourceAttributes" : "DepartmentId",
          "destinationAttributes" : "DepartmentId"
        }

22.3.5.1 rel属性の値

rel属性は、現在のリソースとリンクが指すリソースとの間のリンク関係のタイプを定義します。関係は、表22-2に示すいずれかの値で指定できます。


表22-2 ADF RESTリソースの記述でのリンク関係

リンク関係 説明

self

常にリソース用に生成されます。hrefは、リソース自体またはリソースの記述を指します。linksオブジェクトでは、リンク名は、このrelselfとなります。

canonical

常に生成されます。hrefは、正規リソースまたは正規リソースの記述を指します。正規リソースが定義されていない場合、selfが持っているのと同じhrefを持ちます。linksオブジェクトでは、リンク名は、このrelcanonicalとなります。

parent

常にネストされたリソース用に生成されます。hrefは、親リソースのselfリンクを指します。linksオブジェクトでは、リンク名は、このrelparentとなります。

child

リソースにネストされた子が存在する場合に生成されます。hrefは、ネストされたコレクションを指します。linksオブジェクトでは、リンク名は、このrel<accessor_name>となります。

lov

リソース・アイテムでLOV(値リスト)有効属性用に生成されます。特に、リソース・アイテムのlinksオブジェクトで、hrefはLOV子リソース(リソース・アイテムのchildRefプロパティで指定された名前)を識別します。

enclosure

BLOB属性とCLOB属性用にデフォルトで生成されます。この関係では、サポートされているペイロード・タイプで表すことができないリソースを指すリンクを示します。この関係の例として、JSONで表すことができないイメージがあります。

external

フレームワーク・ドメインの外部に存在するリソース用に生成されます。

current

複数のリソース・バージョン識別子が存在する場合にリソース・バージョンの記述内に生成されます。hrefは、adf-config.xmlバージョン識別子で定義されている、最新のバージョン識別子を指します。

predecessor-version

複数のリソース・バージョン識別子が存在する場合にリソース・バージョンの記述内に生成されます。hrefは、adf-config.xmlバージョン識別子で定義されている、前のバージョン識別子を指します。

successor-version

複数のリソース・バージョン識別子が存在する場合にリソース・バージョンの記述内に生成されます。hrefは、adf-config.xmlバージョン識別子で定義されている、2番目に最新のバージョン識別子を指します。

describe

リソース・バージョンの記述内に生成されます。hrefは、同じバージョンのすべてのリソースのリソース・カタログの記述を指します。


22.3.5.2 href属性の値

href属性は、リンクされたリソースまたはリンクの記述へのURLを定義します。

22.3.5.3 cardinality属性の値

cardinality属性は、ソース・リソースと宛先リソースとの間のカーディナリティを定義するオプションの属性です。この属性は、rel属性値がchildで、リソース・タイプがvnd.oracle.adf.description+jsonである場合にのみ使用可能です。このカーディナリティ属性には次の属性があります。

  • value: カーディナリティの値。例: "1 to *"

  • sourceAttributes: 宛先リソースへのリンクに使用される、ソース・リソース内の属性。

  • destinationAttributes: ソース・リソースへのリンクに使用される、宛先リソース内の属性。

22.4 リソース・バージョンの取得

JDeveloperでは、ADF RESTリソース開発者は、バージョン識別子を作成し、これらの識別子を自分が作成したリソースに関連付けます。バージョン識別子を使用することで、RESTリソース開発者は既存のリソース定義の更新を管理できます。前のバージョンと後方互換性のない変更を使用してリソースを更新する必要がある場合、リソース開発者は新しいバージョンのリソースを作成し、そのリソースに一意のバージョン識別子を割り当てることができます。

ADF RESTランタイムでは、アプリケーションで定義されているバージョンの取得(使用可能なすべてのバージョン、最新のバージョンのみ、または特定のバージョンのみの取得など)をサポートしています。

また、RESTリソース開発者は、バージョン識別子を作成または更新するときにライフサイクル・ステータス(activedesupporteddeprecated)を割り当てることができます。deprecatedのタグが付けられたリソースは、有効なリソースとして処理され、そのステータスはランタイムに影響を与えません。これに対し、ライフサイクル・ステータスdesupportedのタグが付いているリソースは、サービス・クライアントからアクセスできなくなり、サポートされないバージョンに対するリクエストは、次のエラー・メッセージを返します。

JBO-29151: The requested version 'x' has been desupported.

サービス・クライアントが、リクエストされたバージョンに存在しないリソースをリクエストすると、ADF RESTランタイムによって、ステータスがactiveまたはdeprecatedになっている前のバージョンにフォールバックされます。このため、Departmentsリソースのバージョン11.0および11.1が存在し、11.2が存在しない場合は、バージョン11.2へのリクエストに対して、次に最新のリソースであるバージョン11.1が返されます。

22.4.1 使用可能なすべてのバージョン・リリース名の取得

ADF RESTランタイムでは、GETメソッドを使用した、サービス・エンドポイントに定義されているバージョン・リリース名の取得をサポートしています。

バージョン・リリース名を調査する手順は次のとおりです。

  1. サービス・エンドポイントの記述を実行し、その記述内で使用可能なバージョン・リリース名を検索します。

  2. 次の要素を調査して、リリース名バージョン識別子の順序を理解します。

    • versionは、adf-config.xmlファイルで定義されているバージョン識別子のリリース名を指定します。

    • isLatestプロパティは、バージョンが最新のバージョン識別子であることを指定します。

    • predecessor-versionは、前のバージョン識別子へのリンクを指定します。

    • successor-versionは、2番目に最新のバージョン識別子へのリンクを指定します。

    • currentは、最新のバージョン識別子へのリンクを指定します。

たとえば、2つのリリース名バージョン識別子を持つサービス・エンドポイントの記述は、次のオブジェクトを返します。

{
    "items" : [
        {
            "version" : "version_identifier_latest",
            "isLatest" : true,
            "links" : [
                {
                    "rel" : "self",
                    ...
 
                },
                {
                    "rel" : "canonical",
                    ...
 
                },
                {
                    "rel" : "predecessor-version",
                    ...
 
                },
                {
                    "rel" : "describe",
                    ...
 
                }
            ]
        },
        {
            "version" : "version_identifier_previous",
            "links" : [
                {
                    "rel" : "self",
                    ...
                },
                {
                    "rel" : "canonical",
                    ...
                },
                {
                    "rel" : "successor-version",
                    ...
                },
                {
                    "rel" : "describe",
                    ...
                }
            ]
        }
    ],
    "links" : [
     ...
        {
            "rel" : "current",
                    ...
        }
    ]
}

次のサンプルは、demoアプリケーションのリソース・カタログで定義されている、使用可能なすべてのリリース名バージョン識別子を取得します。このサンプルでは、3つのバージョン識別子が11.011.1および11.2で、11.2が現在の(最新の)バージョンです。タイプpredecessor-versionsuccessor-versionのリンクは、各バージョンの位置をバージョンのリストにおけるそれぞれの相対位置で指定することに注意してください。

リクエスト

  • URL

    http://server/demo/rest

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.description+json

  • ペイロード

    {
        "items" : [
            {
                "version" : "11.2",
                "isLatest" : true,
                "links" : [
                    {
                        "rel" : "self",
                        "href" : "http://server/demo/rest/11.2",
                        "name" : "self",
                        "kind" : "item"
                    },
                    {
                        "rel" : "canonical",
                        "href" : "http://server/demo/rest/11.2",
                        "name" : "canonical",
                        "kind" : "item"
                    },
                    {
                        "rel" : "predecessor-version",
                        "href" : "http://server/demo/rest/11.1",
                        "name" : "predecessor-version",
                        "kind" : "item"
                    },
                    {
                        "rel" : "describe",
                        "href" : "http://server/demo/rest/11.2/describe",
                        "name" : "describe",
                        "kind" : "describe"
                    }
                ]
            },
            {
                "version" : "11.1",
                "links" : [
                    {
                        "rel" : "self",
                        "href" : "http://server/demo/rest/11.1",
                        "name" : "self",
                        "kind" : "item"
                    },
                    {
                        "rel" : "canonical",
                        "href" : "http://server/demo/rest/11.1",
                        "name" : "canonical",
                        "kind" : "item"
                    },
                    {
                        "rel" : "predecessor-version",
                        "href" : "http://server/demo/rest/11.0",
                        "name" : "predecessor-version",
                        "kind" : "item"
                    },
                    {
                        "rel" : "successor-version",
                        "href" : "http://server/demo/rest/11.2",
                        "name" : "successor-version",
                        "kind" : "item"
                    },
                    {
                        "rel" : "describe",
                        "href" : "http://server/demo/rest/11.1/describe",
                        "name" : "describe",
                        "kind" : "describe"
                    }
                ]
            },
            {
                "version" : "11.0",
                "links" : [
                    {
                        "rel" : "self",
                        "href" : "http://server/demo/rest/11.0",
                        "name" : "self",
                        "kind" : "item"
                    },
                    {
                        "rel" : "canonical",
                        "href" : "http://server/demo/rest/11.0",
                        "name" : "canonical",
                        "kind" : "item"
                    },
                    {
                        "rel" : "successor-version",
                        "href" : "http://server/demo/rest/11.1",
                        "name" : "successor-version",
                        "kind" : "item"
                    },
                    {
                        "rel" : "describe",
                        "href" : "http://server/demo/rest/11.0/describe",
                        "name" : "describe",
                        "kind" : "describe"
                    }
                ]
            }
        ],
        "links" : [
            {
                "rel" : "self",
                "href" : "http://server/demo/rest",
                "name" : "self",
                "kind" : "collection"
            },
            {
                "rel" : "canonical",
                "href" : "http://server/demo/rest",
                "name" : "canonical",
                "kind" : "collection"
            },
            {
                "rel" : "current",
                "href" : "http://server/demo/rest/11.2",
                "name" : "current",
                "kind" : "item"
            }
        ]
    }

22.4.2 特定バージョンのリソースの取得

ADF RESTランタイムでは、GETメソッドを使用した、特定バージョンのリソースの取得をサポートしています。特定のリソース・バージョンとは、設計時にリソースに関連付けられたバージョンです。リリース・バージョン識別子は、adf-config.xmlの概要エディタの「リリース・バージョン」ページで定義されています。

次のサンプルは、2つのバージョンのDepartmentsリソースを記述します。最初のリソースの記述(リクエスト1)はバージョン11.0を返し、2番目の記述(リクエスト2)はバージョン11.1を返します。11.1のリソースの記述は、追加の必須属性HireDatePhoneNumberがリソースで定義されていることを示しています。

リクエスト・バージョン1

  • URL 1

    http://server/demo/rest/11.0/Departments

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.describe+json

  • ペイロード 1

    {
      "Resources" : {
        "Employees" : {
          "discrColumnType" : false,
          "attributes" : [ {
            "name" : "EmployeeId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 6
          }, {
            "name" : "FirstName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 20
          }, {
            "name" : "LastName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "Email",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "JobId",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 10,
            "controlType" : "choice",
            "maxLength" : "10",
          }, {
            "name" : "DepartmentId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 4
          }, {
            "name" : "Salary",
            "type" : "number",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 8,
            "scale" : 2
          }, {
            "name" : "Picture",
            "type" : "attachment",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : false,
            "actions" : [ {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "image/png" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            }, {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "image/png" ]
            } ]
          } ],
          "collection" : {
               ...
              } ]
            } ],
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.0/Employees",
              "name" : "self",
              "kind" : "collection"
            } ],
            "actions" : [ {
              ...
            } ]
          },
          "item" : {
            "links" : [ {
              ...
            } ],
          },
          "links" : [ {
            "rel" : "self",
            "href" : "http://server/demo/rest/11.0/Employees/describe",
            "name" : "self",
            "kind" : "describe"
          }, {
            "rel" : "canonical",
            "href" : "http://server/demo/rest/11.0/Employees/describe",
            "name" : "canonical",
            "kind" : "describe"
          } ]
        }
      }
    }
    

リクエスト・バージョン2

  • URL 2

    http://server/demo/rest/11.1/Departments

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.describe+json

  • ペイロード 2

    {
      "Resources" : {
        "Employees" : {
          "discrColumnType" : false,
          "title" : "Employees All Attributes",
            "name" : "EmployeeId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 6
          }, {
            "name" : "FirstName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 20
          }, {
            "name" : "LastName",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "Email",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 25
          }, {
            "name" : "JobId",
            "type" : "string",
            "updatable" : true,
            "mandatory" : true,
            "queryable" : true,
            "precision" : 10
          }, {
            "name" : "DepartmentId",
            "type" : "integer",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 4
          }, {
            "name" : "Salary",
            "type" : "number",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 8,
            "scale" : 2
          }, {
            "name" : "Picture",
            "type" : "attachment",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : false,
            "actions" : [ {
              "name" : "replace",
              "method" : "PUT",
              "requestType" : [ "image/png" ]
            }, {
              "name" : "delete",
              "method" : "DELETE"
            }, {
              "name" : "get",
              "method" : "GET",
              "responseType" : [ "image/png" ]
            } ]
          }, {
            "name" : "HireDate",
            "type" : "string",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true
          }, {
            "name" : "PhoneNumber",
            "type" : "string",
            "updatable" : true,
            "mandatory" : false,
            "queryable" : true,
            "precision" : 20
          } ],
          "collection" : {
               ...
              } ]
            } ],
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.1/Employees",
              "name" : "self",
              "kind" : "collection"
            } ],
            "actions" : [ {
              ...
            } ]
          },
          "item" : {
            "links" : [ {
              ...
            } ]
          },
          "links" : [ {
            "rel" : "self",
            "href" : "http://server/demo/rest/11.1/Employees/describe",
            "name" : "self",
            "kind" : "describe"
          }, {
            "rel" : "canonical",
            "href" : "http://server/demo/rest/11.1/Employees/describe",
            "name" : "canonical",
            "kind" : "describe"
          } ]
        }
      }
    }
    

22.5 ADF RESTリソースの取得

ADF RESTランタイムでは、次のGETメソッドのユースケースをサポートしています。

  • リソース・コレクションのフェッチ。

  • ページ・リソース・コレクションのフェッチ。

  • 主キー・ファインダ・パラメータを使用したリソース・ペイロードのフィルタ処理。

  • 問合せパラメータを使用したリソース・ペイロードのフィルタ処理。

  • リソース・アイテムのフェッチ。

  • ネストされた子リソースのフェッチ。

  • ソートされたリソース・コレクションのフェッチ。

22.5.1 リソース・コレクションのフェッチ

ADF RESTランタイムでは、GETメソッドを使用したリソース・コレクションのフェッチをサポートしています。

次のサンプルは、バージョン11.0Departmentsリソース・コレクションおよび5つのアイテムをフェッチします。

リクエスト

  • URL

    http://server/sample/rest/11.0/Departments

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourcecollection+json

  • ペイロード

    {
      "items" : [ {
        "DepartmentId" : 10,
        "DepartmentName" : "Administration",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 20,
        "DepartmentName" : "Marketing",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/20",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/20",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/20/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 30,
        "DepartmentName" : "Purchasing",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/30",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/30",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/30/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 40,
        "DepartmentName" : "Human Resources",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/40",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/40",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/40/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 50,
        "DepartmentName" : "Shipping",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/50",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/50",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      } ],
      "count" : 5,
      "hasMore" : true,
      "limit" : 25,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments",
        "name" : "Departments",
        "kind" : "collection"
      } ]
    }
    

22.5.2 リソース・コレクションのページング

ADF RESTランタイムでは、GETメソッドを使用した、行セット・ページ区切りによるリソース・コレクションの取得をサポートしています。GETメソッドを使用したリソース・コレクションのページングは、次のURI問合せパラメータを使用して実行されます。

  • limitは、リソース・コレクション内で返されるリソースの数を制限します。limitがリソース数より大きい場合、フレームワークは使用可能なすべてのリソースを返します。値は、返されるリソースの最大数です。

  • offsetは、ゼロを基準とする索引(0が最初の位置)をコレクションに定義します。索引により、リソース・コレクションの開始位置が識別されます。offsetがリソース数より大きい場合、リソースは返されません。

(Departmentsリソース・コレクションに5つのアイテムがある)次のサンプルは、最初のリクエスト(URL1)が2つのアイテム(索引0と1)を取得し、offsetが省略されているため、レスポンスの開始位置は最初のアイテムになります。別のリソース・アイテム・セットを表示するために、2番目のリクエスト(URL2)では、3番目のアイテムに対応するように2offsetが使用され、2つのアイテム(索引2と3)のみを追加で取得するために2limitを使用して作成されており、最後のリクエスト(URL3)では、5つのリソース・コレクション・アイテムの最後のアイテム(索引4)を返すために4offsetが使用されています。

新しいリソース・アイテム・セットが取得されるたびに、レスポンスのhasMore属性は追加のアイテムがコレクションから返される可能性があるかどうかを示します。この例では、コレクションに含まれるアイテムは5つのみであるため、URL3のレスポンスではhasMorefalseに設定され、アイテムの最後のセットが取得済であることを示します。

limitパラメータがページングURLで省略された場合、ADF RESTランタイムでは、limitが(リソースのイテレータ・バインディング定義でデフォルトのRangeSize値として決められている) 25であると想定されることに注意してください。この場合、最大25のアイテムが各リクエストで返されます。このため、コレクションをページングする場合は、常にlimit問合せパラメータを含めて、必要な数のリソース・アイテムのみが返されるようにし、それ以上返されないようにするのがベスト・プラクティスです。

リクエスト

  • URL 1

    http://server/demo/rest/11.0/Departments?limit=2

  • URL 2

    http://server/demo/rest/11.0/Departments?offset=2&limit=2

  • URL 3

    http://server/demo/rest/11.0/Departments?offset=4&limit=2

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourcecollection+json

  • ペイロード 1

    {
      "items" : [ {
        "DepartmentId" : 10,
        "DepartmentName" : "Administration",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 20,
        "DepartmentName" : "Marketing",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/20",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/20",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/20/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      } ],
      "count" : 2,
      "hasMore" : true,
      "limit" : 2,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments",
        "name" : "Departments",
        "kind" : "collection"
      } ]
    }
    
  • ペイロード 2

    {
      "items" : [ {
        "DepartmentId" : 30,
        "DepartmentName" : "Purchasing",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/30",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/30",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/30/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 40,
        "DepartmentName" : "Human Resources",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/40",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/40",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/40/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      } ],
      "count" : 2,
      "hasMore" : true,
      "limit" : 2,
      "offset" : 2,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments",
        "name" : "Departments",
        "kind" : "collection"
      } ]
    }
    
  • ペイロード 3

    {
      "items" : [ {
        "DepartmentId" : 50,
        "DepartmentName" : "Shipping",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/50",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/50",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      } ],
      "count" : 1
      "hasMore" : false,
      "limit" : 25
      "offset" : 4,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments",
        "name" : "Departments",
        "kind" : "collection"
      } ]
    }
    

22.5.3 主キー値によるリソース・コレクションのフィルタ処理

ADF RESTランタイムでは、GETメソッドおよび(リソースの1つ以上の主キー属性で定義されるファインダを含む)固定URLを使用したリソース・コレクションのフェッチをサポートしています。リソースの基礎となる各ビュー・オブジェクトは、少なくとも1つの主キー属性を定義します。ADF RESTランタイムでは、ファインダ問合せ文字列の主キー値を渡してコレクションをフィルタ処理することをサポートしています。

主キー(PK)によるフィルタ処理は、1つ以上の主キー値を指定するファインダ問合せ文字列を使用して実行されます。主キー問合せ文字列パラメータを含むファインダの形式は、次のとおりです。

finder=PrimaryKey;<PKattr1>=<PKvalue1>,<PKattr2>=<PKvalue2>,...

たとえば、リソース・コレクションEmployeesは、主キー属性EmployeeIdを定義します。特定の従業員の主キー検索を使用してコレクションをフィルタ処理するには、検索問合せ文字列を、次の例で示すように指定します。

finder=PrimaryKey;EmployeeId=101

リソースが、複数の部分からなる主キーによって定義される場合、検索は主キー値の対応する数を渡してコレクションをフィルタ処理できます。たとえば、リソース・コレクションInventoryには、主キー属性としてProductIdおよびWarehouseIdがあります。特定のインベントリ・アイテムの主キー検索を使用してコレクションをフィルタ処理するには、検索問合せ文字列に両方の主キー値を、次の例で示すように指定します。

finder=PrimaryKey;ProductId=8568,WarehouseId=45

リソース・コレクションの記述は、ファインダおよび主キー属性を説明します。主キー・ファインダを使用する手順は次のとおりです。

  1. リソースの記述を実行し、コレクション要素内のfinders属性を検索します。name属性は、ファインダをPrimaryKeyとして識別します。また、attributesの下の主キー属性の名前も検索します。

  2. 問合せパラメータfinderを指定してGETを実行し、ファインダ名PrimaryKeyを使用して主キー属性を渡します。

たとえば、Employeesリソースの記述は次を返します。

"collection" : {
     "rangeSize" : 24,
     "finders" : [ {
       "name" : "PrimaryKey",
       "attributes" : [ {
         "name" : "EmployeeId",
         "type" : "integer",
         "updatable" : true,
         "mandatory" : true,
         "queryable" : false
         "precision" : 4,
} ]

次のサンプルは、(EmployeeId属性値101が渡される)ファインダPrimaryKeyで指定されたEmployeesコレクションをフェッチします。

注意: 主キーではない属性でコレクションをフィルタ処理するには、「行検索によるリソース・コレクションのフィルタ処理」を参照してください。

リクエスト

  • URL

    http://server/demo/rest/11.1/Employees?finder=PrimaryKey;EmployeeId=101

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "items" : [ {
        "EmployeeId" : 101,
        "FirstName" : "Neena",
        "LastName" : "Smith",
        "Email" : "NSMITH",
        "JobId" : "AD_VP",
        "DepartmentId" : 90,
        "Salary" : 2000,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.1/Employees/101",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.1/Employees/101",
          "name" : "Employees",
          "kind" : "item"
        } ]
      } ],
      "count" : 1,
      "hasMore" : false,
      "limit" : 25,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.1/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    

22.5.4 問合せパラメータによるリソース・コレクションのフィルタ処理

ADF RESTランタイムでは、GETメソッドを使用した、問合せパラメータによるリソース・コレクションのフェッチをサポートしています。リソース・コレクションは、次の式を使用して問い合わせることができます。

サポートされる演算子:

  • より大きい: >

  • より小さい: <

  • 以上: >=

  • 以下: <=

  • 論理積: AND

  • 論理和: OR

  • 等価: =

  • 相似: LIKE

特殊文字:

  • リテラルの定義: "および'

  • エスケープ: \

  • ワイルドカード: *

次のサンプルは、30未満のDepartmentId値が割り当てられた部門をフェッチします。

リクエスト

  • URL

    http://server/demo/rest/11.0/Departments?q=DepartmentId<30

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourcecollection+json

  • ペイロード

    {
      "items" : [ {
        "DepartmentId" : 10,
        "DepartmentName" : "Administration",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 20,
        "DepartmentName" : "Marketing",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/20",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/20",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/20/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      } ],
      "count" : 2,
      "hasMore" : false,
      "limit" : 25,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments",
        "name" : "Departments",
        "kind" : "collection"
      } ]
    }
    

22.5.5 リソース・アイテムのフェッチ

ADF RESTランタイムでは、GETメソッドを使用したリソース・コレクションのアイテムのフェッチをサポートしています。

次のサンプルは、バージョン11.0Departmentsリソース・コレクションのインスタンスのすべてのフィールドをフェッチします。

リクエスト

  • URL

    http://server/demo/rest/11.0/Departments/50

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "DepartmentId" : 50,
      "DepartmentName" : "Shipping",
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments/50",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Departments/50",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "child",
        "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    

22.5.6 ネストされた子リソースのフェッチ

ADF RESTランタイムでは、GETメソッドを使用した、ネストされたリソースの取得をサポートしています。

次のサンプルは、バージョン11.0EmployeesリソースをDepartmentsリソースの子として返します。最初のリクエスト・サンプル(URL 1)は、従業員120で識別される単一の子リソース・アイテムを取得します。URLパラメータchildは、リクエストされたリソースEmployeesの関係を識別します。

2番目のリクエスト(URL 2)では、問合せパラメータexpandを使用して、Departmentsリソース・コレクション50でネストされているすべてのEmployeesリソース・アイテムが確実に返されるようにしています。

ネストされたリソースの識別に使用される名前は、リソースがADFビジネス・コンポーネント・モデル・プロジェクトで作成される場合、設計時に決定されることに注意してください。モデル・プロジェクトで作成されるネストされたリソースのデフォルト名は、ネストされたリソースのビュー・リンク・アクセッサ定義の宛先ビュー・インスタンスです(ビュー・リンクDeptToEmpFkLinkEmployeesView1など)。このため、ADF RESTリソース開発者にとって、リソース名をURLパラメータとしてより適切な名前に変更することがベスト・プラクティスです。この例では、リソース名は、親リソース名Departmentsの命名規則に従ってEmployeesに変更されています。

リクエスト

  • URL 1

    http://server/demo/rest/11.0/Departments/50/child/Employees/120

  • URL 2

    http://server/demo/rest/11.0/Departments/50?expand=Employees

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード 1

    {
      "EmployeeId" : 120,
      "FirstName" : "Matthew",
      "LastName" : "Weiss",
      "Email" : "MWEISS",
      "JobId" : "ST_MAN",
      "DepartmentId" : 50,
      "Salary" : 8000,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees/120",
        "name" : "Employees",
        "kind" : "item"
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees/120",
        "name" : "Employees",
        "kind" : "item"
      }, {
        "rel" : "parent",
        "href" : "http://server/demo/rest/11.0/Departments/50",
        "name" : "Departments",
        "kind" : "item"
      } ]
    }
    
  • ペイロード 2

    {
      "DepartmentId" : 50,
      "DepartmentName" : "Shipping",
      "Employees" : [ {
        "EmployeeId" : 120,
        "FirstName" : "Matthew",
        "LastName" : "Weiss",
        "Email" : "MWEISS",
        "JobId" : "ST_MAN",
        "DepartmentId" : 50,
        "Salary" : 8000,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees/120",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees/120",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "parent",
          "href" : "http://server/demo/rest/11.0/Departments/50",
          "name" : "Departments",
          "kind" : "item"
        } ]
      }, {
        "EmployeeId" : 121,
        "FirstName" : "Adam",
        "LastName" : "Fripp",
        "Email" : "AFRIPP",
        "JobId" : "ST_MAN",
        "DepartmentId" : 50,
        "Salary" : 8200,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees/121",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees/121",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "parent",
          "href" : "http://server/demo/rest/11.0/Departments/50",
          "name" : "Departments",
          "kind" : "item"
        } ]
      }, {
         ...
        } ]
      } ],
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments/50",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Departments/50",
        "name" : "Departments",
        "kind" : "item"
      } ]
    }
    

22.5.7 リソース・コレクションのソート

ADF RESTランタイムでは、GETメソッドを使用した、フェッチ済リソース・コレクションのソートをサポートしています。

リソース・コレクションのソートは、orderBy問合せ文字列パラメータを1つ以上の属性名と組み合せて使用して実行されます。次のオプションのソート順序フラグを各属性に関連付けることができます。

  • ascは昇順でソートします。(デフォルト)

  • descは降順でソートします。

orderBy問合せ文字列パラメータの形式は次のとおりです。

<orderBy_attribute1_name>:<(asc/desc)>, <orderBy_attribute2_name>:<(asc/desc)>

例: attribute1:asc,attribute2

次のサンプル(URL1)は、DepartmentName属性でソートされたDepartmentsコレクションをフェッチします。2番目のサンプル(URL2)は、salary属性でソートされた子Employeesコレクションをフェッチします。いずれのリクエスト・サンプルにもソート順序フラグが指定されていないため、レスポンスは昇順になります。

リクエスト

  • URL 1

    http://server/demo/rest/11.0/Departments?orderBy=DepartmentName

  • URL 2

    http://server/demo/rest/11.0/Departments/50/child/Employees?orderBy=Salary

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード 1

    {
      "items" : [ {
        "DepartmentId" : 10,
        "DepartmentName" : "Administration",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 40,
        "DepartmentName" : "Human Resources",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/40",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/40",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/40/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 20,
        "DepartmentName" : "Marketing",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/20",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/20",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/20/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 30,
        "DepartmentName" : "Purchasing",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/30",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/30",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/30/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      }, {
        "DepartmentId" : 50,
        "DepartmentName" : "Shipping",
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/50",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/50",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/50/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
      } ],
      "count" : 5,
      "hasMore" : false,
      "limit" : 25,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments",
        "name" : "Departments",
        "kind" : "collection"
      } ]
    }
    
  • ペイロード 2

    {
      "items" : [ {
        "EmployeeId" : 132,
        "FirstName" : "TJ",
        "LastName" : "Olson",
        "Email" : "TJOLSON",
        "JobId" : "ST_CLERK",
        "DepartmentId" : 50,
        "Salary" : 2100,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Employees/132",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Employees/132",
          "name" : "Employees",
          "kind" : "item"
        } ]
      }, {
        "EmployeeId" : 136,
        "FirstName" : "Hazel",
        "LastName" : "Philtanker",
        "Email" : "HPHILTAN",
        "JobId" : "ST_CLERK",
        "DepartmentId" : 50,
        "Salary" : 3100,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Employees/136",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Employees/136",
          "name" : "Employees",
          "kind" : "item"
        } ]
      } ],
      "count" : 2,
      "hasMore" : false,
      "limit" : 25,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    

22.6 リソース・アイテムの作成

ADF RESTランライムでは、次の作成ユースケースをサポートしています。

  • コレクションでのリソース・アイテムの作成。

  • 子リソース・アイテムの作成。

22.6.1 コレクションでのリソース・アイテムの作成

ADF RESTランタイムでは、POSTメソッドを使用した、既存のリソース・コレクションでのリソース・アイテムの作成をサポートしています。

次のサンプルは、単一のアイテムを含む新しいDepartmentsリソース・コレクションを作成します。

リクエスト

  • URL

    http://server/demo/rest/11.0/Departments

  • HTTPメソッド

    POST

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "DepartmentId" : 15,
      "DepartmentName" : "NewDept"
    }
    

レスポンス

  • HTTPコード

    201

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • 場所

    http://server/demo/rest/Departments/15

  • ペイロード

    {
      "DepartmentId" : 15,
      "DepartmentName" : "NewDept",
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments/15",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Departments/15",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "child",
        "href" : "http://server/demo/rest/11.0/Departments/15/child/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    

22.6.2 子リソース・アイテムの作成

ADF RESTランタイムでは、POSTメソッドを使用した、1つのラウンドトリップでのADF REST子リソース・アイテムの作成をサポートしています。作成は、親と子が両方とも存在しない場合にのみ成功します。

次のサンプルは、ネストされたリソース・アイテムを作成します。最初のリクエスト・サンプル(URL1)は、既存のDepartmentsリソース内に従業員999で識別される子リソース・アイテムを作成します。2番目のリクエスト(URL2)は、親リソースと子リソースを作成します。

リクエスト

  • URL 1

    http://server/demo/rest/11.0/Departments/15/child/Employees

  • URL 2

    http://server/demo/rest/11.0/Departments

  • HTTPメソッド

    POST

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード 1

    {
         "EmployeeId": 999,
         "FirstName": "New",
         "LastName": "Guy",
         "Email": "NGUY",
         "JobId": "SA_REP",
         "DepartmentId": 15,
         "Salary": 9999
    }
    
  • ペイロード 2

    {
         "DepartmentId": 17,
         "DepartmentName": "NewerDept",
         "Employees": [
             {
                 "EmployeeId": 99999,
                 "FirstName": "Newer",
                 "LastName": "Guy",
                 "Email": "NRGUY",
                 "JobId": "SA_MAN",
                 "DepartmentId": 17,
                 "Salary": 10001
             }
         ]
    }
    

レスポンス

  • HTTPコード

    201

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • 場所

    http://server/demo/rest/11.0/Departments/15/child/Employees/999

  • ペイロード 1

    {
      "EmployeeId" : 999,
      "FirstName" : "New",
      "LastName" : "Guy",
      "Email" : "NGUY",
      "JobId" : "SA_REP",
      "DepartmentId" : 15,
      "Salary" : 9999,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments/15/child/Employees/999",
        "name" : "Employees",
        "kind" : "item"
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Departments/15/child/Employees/999",
        "name" : "Employees",
        "kind" : "item"
      }, {
        "rel" : "parent",
        "href" : "http://server/demo/rest/11.0/Departments/15",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "lov",
        "href" : "http://server/demo/rest/11.0/Departments/15/child/Employees/999/lov/JobsView1",
        "name" : "JobsView1",
        "kind" : "collection"
      } ]
    }
    
  • 場所

    http://server/demo/rest/11.0/Departments/17/child/Employees/99999

  • ペイロード 2

    {
      "DepartmentId" : 17,
      "DepartmentName" : "NewerDept",
      "Employees" : [ {
        "EmployeeId" : 99999,
        "FirstName" : "Newer",
        "LastName" : "Guy",
        "Email" : "NRGUY",
        "JobId" : "SA_MAN",
        "DepartmentId" : 17,
        "Salary" : 10001,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/17/child/Employees/99999",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/17/child/Employees/99999",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "parent",
          "href" : "http://server/demo/rest/11.0/Departments/17",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "lov",
          "href" : "http://server/demo/rest/11.0/Departments/17/child/Employees/99999/lov/JobsLOV",
          "name" : "JobsLOV",
          "kind" : "collection"
        } ]
      } ],
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments/17",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Departments/17",
        "name" : "Departments",
        "kind" : "item"
      } ]
    }
    

22.7 リソース・アイテムの更新

ADF RESTランタイムでは、PATCHメソッドを使用したリソース・アイテムの更新をサポートしています。更新は、行がすでに存在している場合にのみ成功します。

次のサンプルは、(DepartmentNameがリクエスト・ペイロードで変更された) Departmentsアイテム15を更新します。

リクエスト

  • URL

    http://server/demo/rest/11.0/Departments/15

  • HTTPメソッド

    PATCH

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "DepartmentId" : 15,
      "DepartmentName" : "UpdatedDeptName"
    }
    

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "DepartmentId" : 15,
      "DepartmentName" : "UpdatedDeptName",
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments/15",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Departments/15",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "child",
        "href" : "http://server/demo/rest/11.0/Departments/15/child/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    

22.8 リソース・アイテムの削除

ADF RESTランタイムでは、DELETEメソッドを使用したリソース・アイテムの削除をサポートしています。フレームワークでは、リソース・コレクションの削除は現在サポートされていません。

次のサンプル(URL1)は、Employeesリソース・コレクションの従業員ID 99999Departmentsリソース・アイテム17の子として削除します。2番目のリクエストURLは、Departmentsリソース・アイテム17を削除します。

リクエスト

  • URL 1

    http://server/demo/rest/11.0/Departments/17/child/Employees/99999

  • URL 2

    http://server/demo/rest/11.0/Departments/17

  • HTTPメソッド

    DELETE

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    204

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

22.9 データ整合性のチェック

ADF RESTランタイムでは、リクエストされたリソースでデータ整合性チェックが有効な場合、レスポンス・ヘッダーへのエンティティ・タグ(ETag)の生成をサポートしています。データ整合性チェックは、リソースの基礎となるエンティティ・オブジェクトで更新識別子属性を構成する必要があるADFビジネス・コンポーネント開発者によって有効化されます。

リソースの基礎となるエンティティ・オブジェクトでエンティティ更新識別子が構成されている場合、ADF RESTランタイムは、サーバー側の各リソースの状態を示す一意の値を割り当てます。実行時に、サーバー側リソースの基礎となっている行が変更されると、Oracle ADFは新しい状態値をETagに割り当てます。次のヘッダーは、Departmentsリソース・アイテムを取得するリクエストで返されるETagを示しています。

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Location:
Content-Length: 1069
Content-Type: application/json
ETag: "ACED00057372037200136261636C6520136261636C65237200136261636C652"
Content-Encoding:
Link: <http://server/demo/rest/11.0/Departments/10>;rel="self";kind="item";name="Departments"

注意:

ETagおよびデータ整合性チェックは、RESTリソースで自動的に有効化されないことに注意してください。ETag値の生成をサポートするために、ADFビジネス・コンポーネント開発者は、チェックされるリソースの基礎となるエンティティ・オブジェクトで更新識別子有効属性を構成する必要があります。エンティティ・オブジェクトでの更新識別子属性の構成の詳細は、「同時更新によるデータの消失を防ぐ方法」を参照してください。

サービス・クライアントは、各リソース・アイテムのレスポンス・ヘッダーで返されたETag値を使用して、事前条件ヘッダー(If-Match/If-None-Match)を含む後続のリクエストを実行できます。指定されたETagおよび事前条件に基づいて、サーバーは現在のリソース状態を評価し、指定されたETagと照合します。事前条件が満たされている場合はリクエストされた操作が実行され、満たされていない場合は412エラーが返されます。エラー・ペイロードにはサーバー側の現在のリソースが含まれ、ヘッダーでは現在のETag値も反映されます。

ETag値のテストをサポートするために、ADF RESTフレームワークでは、次の事前条件ヘッダー・フィールドが提供されています。これらの事前条件フィールドを使用すると、フレームワークは、指定されたETag値を、前にリクエストされたアイテムのETag値と比較します。

  • クライアントが(前のリソース・アイテム・レスポンスから取得して)提供している状態が、サーバーの現在の状態に一致することを検証します。

    If-Match: "<ETag value from resource item response>"
    
  • クライアントが(前のリソース・アイテム・レスポンスから取得して)提供している状態が、サーバーの現在の状態に一致しないことを検証します。

    If-None-Match: "<ETag value from resource item response>"
    

次に、データ整合性をチェックする場合の一般的なユースケースを示します。

  • リソース・アイテムが、更新前のサーバー側リソース状態に一致することを確認します。

  • リクエストされたいずれのアイテムも前にリクエストされたアイテムに一致しない場合、サーバー側リソース状態を使用してリソース・アイテムを取得します

これらのユースケースにGETメソッドとPATCHメソッドが関連する場合は、事前条件ヘッダーとETag値を使用して、HTTPメソッド操作がリソースの現在の状態に適用されることを確認できます。

リソース・コレクションを取得すると、追加のカスタム・プロパティchangeIndicatorが、データ整合性が有効なリソースのレスポンス・ペイロードに出現します。このプロパティには、リクエストされたコレクション内の各リソース・アイテムの現在のETag値が含まれます。次のサンプルは、Departmentsリソース・コレクションのlinksセクション内のchangeIndicatorプロパティを示しています。リソース・コレクション・ペイロードにETag値が存在すると、サーバー・クライアントは個別のリソース・アイテムからETagを取得するためのリクエストの数を減らすことができるため、サーバー・クライアントにとって便利です。

レスポンス内にRelState属性が存在することにも注意してください。これは、ADFビジネス・コンポーネント開発者がデータ整合性チェックをサポートするためにエンティティ・オブジェクトで構成した更新識別子属性の名前です。この属性の値は、状態が更新された回数を反映します。

{
  "items" : [ {
    "DepartmentId" : 10,
    "DepartmentName" : "Administration",
    "RelState" : 1,
    "links" : [ {
      "rel" : "self",
      "href" : "http://server/demo/rest/11.0/Departments/10",
      "name" : "Departments",
      "kind" : "item",
      "properties" : {
        "changeIndicator" : "ACED0005737200136A6176612E7574696C2E41727261794C69737
        47881D21D99C7619D03000149000473697A65787000000001770400000001737200186F721
        636C652E6A626F2E646F6D61696E2E4E7564A362286F0200015B0004646174617400025B45
        27870757200025B42ACF317F8060854E00200007870"
      }
    "links" : [ {
      "rel" : "self",
      "href" : "http://server/demo/rest/11.0/Departments/10",
      "name" : "Departments",
      "kind" : "item",
    }, {
      "rel" : "canonical",
      "href" : "http://server/demo/rest/11.0/Departments/10",
      "name" : "Departments",
      "kind" : "item",
      "properties" : {
        "changeIndicator" : "ACED0005737200136A6176612E7574696C2E149000473697A6578
        70000000017704000000017372001B6F7261636C652E6A626F2E646F60000C78"
      }
    }, {
      "rel" : "child",
      "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
      "name" : "Employees",
      "kind" : "collection",
    } ]
  }, {
    "DepartmentId" : 20,
    "DepartmentName" : "Marketing",
    "links" : [ {
      "rel" : "self",
      "href" : "http://server/demo/rest/11.0/Departments/20",
      "name" : "Departments",
      "kind" : "item",
      "properties" : {
        "changeIndicator" : "ACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000001770400000001737200186F7261636C652E6A626F2E646F6D61696E2E4E756D626572A5B1371914E0BFDA0200014900096D48617368436F6465787200116F7261636C652E73716C2E4E554D424552E90466EE632BE1D5020000787200106F7261636C652E73716C2E446174756D4078F514A362286F0200015B0004646174617400025B427870757200025B42ACF317F8060854E0020000787000000002C10A0000000078"
      }
    }, {
      "rel" : "canonical",
      "href" : "http://server/demo/rest/11.0/Departments/20",
      "name" : "Departments",
      "kind" : "item"
    }, {
      "rel" : "child",
      "href" : "http://server/demo/rest/11.0/Departments/20/child/Employees",
      "name" : "Employees",
      "kind" : "collection"
    } ]
  }, {
      ...
    } ]
  } ],
  "count" : 5,
  "hasMore" : true,
  "limit" : 25,
  "offset" : 0,
  "links" : [ {
    "rel" : "self",
    "href" : "http://server/demo/rest/11.0/Departments",
    "name" : "Departments",
    "kind" : "collection"
  } ]
}

22.9.1 ADF RESTリソース・アイテムの更新時のデータ整合性のチェック

ADF RESTランタイムでは、更新識別子属性が有効になっているADFビジネス・コンポーネント・エンティティ・オブジェクトが基礎となっているリソース・アイテムを、PATCHメソッドを使用して更新する際のデータ整合性チェックをサポートしています。

ETagヘッダーおよび条件付きヘッダー・フィールドを使用してデータ整合性をチェックする手順は次のとおりです。

  1. 次に示すように、リソース・アイテムのGETリクエストのヘッダーからETag値を取得します。

    HTTP/1.1 200 OK
    Cache-Control: no-cache, no-store, must-revalidate
    Location:
    Content-Length: 861
    Content-Type: application/json
    ETag: "responseETag123"
    Content-Encoding:
    Link: <http://server/demo/rest/11.0/Departments/10>;rel="self";kind="item";name="Departments"
    Set-Cookie: JSESSIONID=jXvsJ1GpdkFJV5Jh0yk7D72vPZ42t8tLYDg74NRKFQzXdnsjG9vv!1113104013; path=/; HttpOnly
    X-ORACLE-DMS-ECID: 51f1ff4535af720c:-7e156247:148ec9eeb3b:-8000-00000000000001ad
    X-Powered-By: Servlet/2.5 JSP/2.1
     
    {
      "DepartmentId" : 10,
      "DepartmentName" : "Administration",
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments/10",
        "name" : "Departments",
        "kind" : "item",
        "properties" : {
          "changeIndicator" : "responseETag123"
        }
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Departments/10",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "child",
        "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    
  2. リソース・アイテムのPATCHリクエストを実行し、次の条件付きヘッダー・フィールドを指定してデータ整合性をチェックします。

    • If-Match: "<ETag value from resource item response>" (リクエストされたリソース・アイテムの状態が、前のリソース・アイテム・レスポンスの最新状態であることを検証します)。

次のサンプルは、If-Match事前条件テストが満たされた場合、Departments 10リソース・アイテムのDepartmentNameフィールドを更新します。最初のリクエスト(リクエスト1)で、ETag値responseETag123は、サーバー側の現在のDepartments 10リソース・アイテムのETagと同一であり、リソース・アイテムの状態がサーバー側と一致していることを示します。この結果、DepartmentNameに対する更新が許可されます。

ただし、後続のリクエスト(リクエスト2)では、If-Match事前条件で指定されたETagは変更されておらず、サーバー側のDepartments 10リソース・アイテムの新しいETag値と一致しなくなります。古いETag値が2番目のリクエストで使用された結果として、更新は(事前条件テストに失敗したことを示す) HTTPコード412で失敗し、現在のETag値responseETag567がレスポンス・ヘッダーで返されます。

リクエスト1

  • URL 1

    http://server/demo/rest/11.0/Departments/10

  • HTTPメソッド

    PATCH

  • 事前条件1

    If-Match: "responseETag123"

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード 1

    {
      "DepartmentName" : "FirstAttempt_NewDepartmentName"
    }
    

レスポンス1

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ETag

    responseETag567

  • ペイロード 1

    {
        "DepartmentId" : 10,
        "DepartmentName" : "FirstAttempt_NewDepartmentName",
        "RelState" : null,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item",
          "properties" : {
            "changeIndicator" : "responseETag567"
          }
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
    }
    

リクエスト2

  • URL 2

    http://server/demo/rest/11.0/Departments/10

  • HTTPメソッド

    PATCH

  • 事前条件2

    If-Match: "staleETag789"

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード 2

    {
      "DepartmentName" : "SecondAttempt_NewDepartmentName"
    }
    

レスポンス2

  • HTTPコード

    412 (事前条件が失敗しました)

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ETag

    responseETag567

  • ペイロード 2

    {
        "DepartmentId" : 10,
        "DepartmentName" : "FirstAttempt_NewDepartmentName",
        "RelState" : null,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item",
          "properties" : {
            "changeIndicator" : "responseETag567"
          }
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
    }

22.9.2 ADF RESTリソース・アイテムの取得時のデータ整合性のチェック

ADF RESTランタイムでは、更新識別子属性が有効なADFビジネス・コンポーネント・エンティティ・オブジェクトが基礎となっているリソース・アイテムを、GETメソッドを使用して取得する際のデータ整合性チェックをサポートしています。

ETagヘッダーおよび条件付きヘッダー・フィールドを使用してデータ整合性をチェックする手順は次のとおりです。

  1. 次に示すように、リソース・アイテムのGETリクエストのヘッダーからETag値を取得します。

    HTTP/1.1 200 OK
    Cache-Control: no-cache, no-store, must-revalidate
    Location:
    Content-Length: 861
    Content-Type: application/json
    ETag: "responseETag123"
    Content-Encoding:
    Link: <http://server/demo/rest/11.0/Departments/10>;rel="self";kind="item";name="Departments"
    Set-Cookie: JSESSIONID=jXvsJ1GpdkFJV5Jh0yk7D72vPZ42t8tLYDg74NRKFQzXdnsjG9vv!1113104013; path=/; HttpOnly
    X-ORACLE-DMS-ECID: 51f1ff4535af720c:-7e156247:148ec9eeb3b:-8000-00000000000001ad
    X-Powered-By: Servlet/2.5 JSP/2.1
     
    {
      "DepartmentId" : 10,
      "DepartmentName" : "Administration",
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Departments/10",
        "name" : "Departments",
        "kind" : "item",
        "properties" : {
          "changeIndicator" : "ACED0005737200136A6176612E7574696C2E4"
        }
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Departments/10",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "child",
        "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    
  2. リソース・アイテムのGETリクエストを実行し、次の条件付きヘッダー・フィールドを指定してデータ整合性をチェックします。

    • If-None-Match: "<ETag value from resource item response>" (前にリクエストされたいずれのリソース・アイテムの状態も、リソース・アイテム・リクエストの最新状態でないことを検証します)。

次のサンプルは、If-None-Match事前条件が満たされた場合、Departments 10リソース・アイテムを取得します。最初のリクエスト(リクエスト1)で、ETag値responseETag123は、サーバー側の前にリクエストされたDepartments 10リソース・アイテムのETagと一致し、リソース・アイテムの状態がサーバー側と一貫性があることを示します。結果として、事前条件は失敗し、新しいDepartments 10リソース・アイテムを返す必要はありません。リクエストは、サーバーの状態が変更されていないことを示すHTTPコード304を返します。

ただし、後続のリクエスト(リクエスト2)では、If-None-Match事前条件で指定されたETag unmatchedETagXYZはサーバーに存在しません。結果として、事前条件が成功し、Departments 10リソース・アイテムが取得されます。リクエストは、条件が変更されたことを示すHTTPコード200を返し、現在の(変更されていない) ETag値responseETag123がレスポンス・ヘッダーで返されます。

リクエスト1

  • URL 1

    http://server/demo/rest/11.0/Departments/10

  • HTTPメソッド

    GET

  • 事前条件1

    If-None-Match: "responseETag123"

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス1

  • HTTPコード

    304 (状態は変更されていません)

  • コンテンツ・タイプ

    なし

  • ペイロード 1

    なし

リクエスト2

  • URL 2

    http://server/demo/rest/11.0/Departments/10

  • HTTPメソッド

    GET

  • 事前条件2

    If-None-Match: "unmatchedETagXYZ"

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス2

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ETag

    responseETag123

  • ペイロード 2

    {
        "DepartmentId" : 10,
        "DepartmentName" : "Administration",
        "RelState" : null,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item",
          "properties" : {
            "changeIndicator" : "responseETag123"
          }
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.0/Departments/10",
          "name" : "Departments",
          "kind" : "item"
        }, {
          "rel" : "child",
          "href" : "http://server/demo/rest/11.0/Departments/10/child/Employees",
          "name" : "Employees",
          "kind" : "collection"
        } ]
    }
    

22.10 添付ファイルの使用

ADF RESTランタイムでは、BLOB属性またはCLOB属性のコンテンツ・ストリーミングをサポートしています。

LOB属性は、次の方法で処理されます。

  • ペイロード自体には含まれていないカスタム・コンテンツとしてリンクされます。

    これは、BLOB属性とCLOB属性のデフォルト設定であり、サポートされているペイロード・タイプ(image/pngなど)で表すことができないリソースを指すenclosureリンク・タイプを使用してレスポンス・ペイロードで指定されます。

  • Base64文字列形式にエンコードされ、リクエスト・ペイロード自体に含められます。

現在、高度な機能(チャンク・エンコードのサポートなど)は、ADF RESTランタイムでサポートされていません。エンタープライズ・アーキテクチャで作業している開発者は、特殊なコンテンツ管理システム(Oracle WebCenter Contentなど)の使用を調査する場合があります。

attributeセクションでLOB属性を示すかわりに、レスポンス・ペイロードにはコンテンツへのenclosureリンクが常に含まれます。Employeesリソース・アイテムの次の記述では、application/octet-streamのデフォルトのrequestTypeを使用してBLOB属性Pictureを定義します。リソース・アイテムのenclosureリンクがitemsセクションに表示されます。actionsセクションでは、コンテンツの操作に使用できる操作を識別します。

{
  "Resources" : {
    "Employees" : {
      "discrColumnType" : false,
      "attributes" : [ {
       ...
      }, {
        "name" : "Picture",
        "type" : "attachment",
        "updatable" : true,
        "mandatory" : false,
        "queryable" : false,
        "actions" : [ {
          "name" : "delete",
          "method" : "DELETE"
        }, {
          "name" : "get",
          "method" : "GET",
          "responseType" : [ "application/octet-stream" ]
        } ]
      } ],
      "item" : {
        "links" : [ {
         ...
        }, {
          "rel" : "enclosure",
          "href" : "http://server/demo/rest/11.0/Employees/101/enclosure/Picture",
          "name" : "Picture",
          "kind" : "other"
        } ],
        "actions" : [ {
        } ]
      },
      "links" : [ {
        ...
      } ]
  }
}

リソース・アイテムの属性コンテンツ・タイプは、ADF RESTリソース開発者がcontentTypeプロパティをLOBタイプ属性のカスタム・プロパティとして構成することで割り当てることができます。たとえば、PNGイメージ・ファイルを使用する場合、コンテンツ・タイプを前もって割り当てることができます。

  • カスタム・プロパティ: contentType

  • : image/png

一部のユースケースでは、この属性自体がなんらかの外部コンテンツへのリンクとなります。属性がこの方法で構成されている場合、リソース・アイテム・ペイロードに表示されるだけでなく、外部コンテンツを指すリンクも作成されます。リソースの説明では、GETアクションのみを外部リンクに使用できます。属性値に含まれるURLを変更するには、リソース・アイテムでの更新のリクエストを実行します。

ADF RESTリソース開発者は、次の属性を追加して、リンクを生成するように属性を構成できます。

  • 名前: inputHandler

  • : oracle.adf.internal.model.rest.core.binding.inputHandler.LinkInputHandler

22.10.1 リソース・アイテムのエンクロージャ・リンクを使用した添付ファイルのストリーミング

ADF RESTランタイムでは、リソース・アイテムのペイロードに含めることができないストリーミング・コンテンツを、そのコンテンツへのリンクを使用することでサポートしています。リンクされたコンテンツに対してサポートされているメソッドはGETとDELETEです。リソース・アイテムを(POSTメソッドを使用して)作成すると同時にLOBコンテンツを作成する場合、コンテンツをbase64としてエンコードする必要があることに注意してください。base64を使用してコンテンツを埋め込む方法のサンプルは、「Base64を使用したLOBコンテンツの置換」を参照してください。

リンクからコンテンツをストリーミングする手順は次のとおりです。

  1. リソース・アイテムを取得し、目的の属性のenclosureリンクを検索します。itemセクションで、使用可能な属性のリンクを定義します。

    または、リソースの説明を実行して、リソース・アイテムで生成されたエンクロージャ・リンクを識別できます。一般に、リソースの説明には、GETリソース・ペイロードでは返されないその他の有用な情報(image/pngなどの予期されるレスポンス・タイプなど)、およびサポートされる属性のアクションが含まれています。

  2. LOBコンテンツへのリンクを使用して、HTTP操作(GETまたはDELETE)を実行します。

Employees 101の次のリソース・アイテムは、linksセクション内のPicture属性のenclosureリンクを示します。

{
  "EmployeeId" : 101,
  "FirstName" : "Neena",
  "LastName" : "Smith",
  "Email" : "NSMITH",
  "JobId" : "AD_VP",
  "DepartmentId" : 90,
  "Salary" : 2000,
  "links" : [ {
    "rel" : "self",
    "href" : "http://server/demo/rest/11.0/Employees/101",
    "name" : "Employees",
    "kind" : "item"
  }, {
    "rel" : "canonical",
    "href" : "http://server/demo/rest/11.0/Employees/101",
    "name" : "Employees",
    "kind" : "item"
  }, {
    "rel" : "lov",
    "href" : "http://server/demo/rest/11.0/Employees/101/lov/JobsLOV",
    "name" : "JobsLOV",
    "kind" : "collection"
  }, {
    "rel" : "enclosure",
    "href" : "http://server/demo/rest/11.0/Employees/101/enclosure/Picture",
    "name" : "Picture",
    "kind" : "other"
  } ]
}

たとえば、次のサンプルは、従業員101に関連付けられているPNGイメージをストリーミングします。

様々なメディア・タイプをサポートするために、リクエスト・タイプはデフォルトでapplication/octet-streamになることに注意してください。ADF RESTリソース開発者がカスタム・プロパティcontentTypeを定義している場合は、指定されたリクエスト・タイプがリソース・アイテムの説明に表示されます。

リクエスト

  • URL

    http://server/demo/rest/11.0/Employees/101/enclosure/Picture

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    image/png

  • ペイロード

    ストリーミングされたコンテンツ

22.10.2 Base64を使用したLOBコンテンツの置換

ADF RESTランタイムでは、コンテンツがbase64文字列形式で表されている場合、JSONペイロードを使用してLOBコンテンツを作成および更新できます。

たとえば、次のサンプルは、従業員101のPNGイメージを置換します。このユースケースでは、Picture属性はbase64でエンコードされた文字列としてリクエスト・ペイロード内に表される必要があります。リソース・アイテム101はすでに存在し、Picture属性のみが操作されるため、他の属性を指定する必要はありません。

レスポンス・ペイロードには、Picture属性へのenclosureリンクが含まれることに注意してください。

リクエスト

  • URL

    http://server/demo/rest/11.0/Employees/101

  • HTTPメソッド

    PATCH

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "Picture" : "/9j/4AAQSkZJRgABAAEAYABgAAD//..."
    }
    

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "EmployeeId" : 101,
      "FirstName" : "Neena",
      "LastName" : "Smith",
      "Email" : "NSMITH",
      "JobId" : "AD_VP",
      "DepartmentId" : 90,
      "Salary" : 2000,
      "links" : [ {
        "rel" : "lov",
        "href" : "http://server/demo/rest/11.0/Employees/101/lov/JobsLOV",
        "name" : "JobsLOV",
        "kind" : "collection"
      }, {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Employees/101",
        "name" : "Employees",
        "kind" : "item"
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.0/Employees/101",
        "name" : "Employees",
        "kind" : "item"
      }, {
        "rel" : "enclosure",
        "href" : "http://server/demo/rest/11.0/Employees/101/enclosure/Picture",
        "name" : "Picture",
        "kind" : "other"
      } ]
    }
    

22.11 高度な操作

ADF RESTランタイムでは、次の高度なユースケースをサポートしています。

  • 既存のリソース・アイテムのコンテキストでLOV属性値を取得します。

  • 属性を制限するフィルタ処理を使用する部分取得によりリソースを問い合わせます。

  • 行検索を使用してリソース・コレクションをフェッチします。

  • リソース・アイテムまたはリソース・コレクションのデータのみを返します。

  • リソース・コレクション内のリソース・アイテムの推定カウントを返します。

  • ビュー・オブジェクト・クライアント・インタフェースで定義されたカスタム・アクションを実行します。

  • HTTPメソッドをオーバーライドして、更新を実行します

  • バッチ・リクエストを実行します。

22.11.1 既存のリソース・アイテムのLOV有効属性値の取得

ADF RESTランタイムでは、GETメソッドを使用した、既存のリソース・アイテムでのLOV有効属性値の取得をサポートしています。

LOV有効属性の既存のリソース・アイテムはLOV子リソースをネストし、この子リソースは、含まれるリソース・アイテムのコンテキストに基づいて適切な値リストを取得するために使用できます。

既存のリソース・アイテムでLOV有効属性を使用する手順は次のとおりです。

  1. リソースの記述を実行し、LOVに関する次の詳細を検索します。

    リソース属性のlov記述でchildRefプロパティを検索し、LOVの選択肢を含む子リソース・コレクションを識別します。

    lov記述には、リソース・アイテムからLOV子リソース・コレクションへのビュー・オブジェクト属性マッピングが含まれます。この属性マッピングには、LOV値が選択された場合に値がリソース・アイテムからコピーされる、子リソースからの1つ以上のソース属性が含まれます。LOVの選択では、LOVを表示する属性以外にリソース・アイテム内の追加の値が導出される場合があります。そのような場合、属性マッピングではderived = trueとしてそれを識別します。最後に、lov記述は、結果がユーザー・インタフェースにバインドされている場合、子リソース・コレクションのどの属性をエンド・ユーザーへの表示に使用できるかを識別します。

  2. 次に、リソース・アイテムのlinks要素を検索し、lovrelで、対応するLOV子リソース(リソース・アイテムchildRefプロパティで指定されている)を識別するhrefを検索します。

    ヒント: リソースの記述は、リソース・コレクションから特定のリソース・アイテム名を指定して完了するテンプレートとしてLOV子リソースを表示します。GETを実行してリソース・コレクションを取得し、特定のリソース・アイテムに対応するLOV子リソースの作業リンクを検索できます。

  3. LOVリンクを使用してGETを実行し、オプションで、追加のフィルタ処理を使用してLOV結果を絞り込むか、ペイロードから不要な属性を除外します。lov記述内にリストされている表示属性を常にフェッチする必要があります。表示属性は、エンド・ユーザーが職位のリストなどの認識できる値リストからLOV値を選択できるようにする属性値です。LOV定義により、LOVの選択が適用された場合に正しいソース属性がリソース・アイテムの更新に使用されるようになります。

たとえば、Employeesリソース・コレクションの記述は、次を返します。

{
  "Resources" : {
    "Employees" : {
      "discrColumnType" : false,
      "attributes" : [ {
        "name" : "EmployeeId",
        "type" : "integer",
        "updatable" : true,
        "mandatory" : true,
        "queryable" : true,
        "precision" : 6
      }, {
        "name" : "FirstName",
        "type" : "string",
        "updatable" : true,
        "mandatory" : false,
        "queryable" : true,
        "precision" : 20
      }, {
        "name" : "LastName",
        "type" : "string",
        "updatable" : true,
        "mandatory" : true,
        "queryable" : true,
        "precision" : 25
      }, {
        "name" : "Email",
        "type" : "string",
        "updatable" : true,
        "mandatory" : true,
        "queryable" : true,
        "precision" : 25
      }, {
        "name" : "JobId",
        "type" : "string",
        "updatable" : true,
        "mandatory" : true,
        "queryable" : true,
        "precision" : 10,
        "controlType" : "choice",
        "maxLength" : "10",
        "lov" : {
          "childRef" : "JobsLOV",
          "attributeMap" : [ {
            "source" : "JobId",
            "target" : "JobId"
          } ],
          "displayAttributes" : [ "JobTitle" ]
        }
     ...

      "item" : {
        "links" : [ {
          "rel" : "lov",
          "href" :
                  "http://server/demo/rest/11.0/Employees/{id}/lov/JobsLOV",
          "name" : "JobsLOV",
          "kind" : "collection"
        }, {
...

次のサンプルは、JobsLOVリソース・コレクションからLOV表示属性JobTitleの値をフェッチします。問合せパラメータonlyDatafieldsにより、表現がフィルタ処理され、レスポンス・ペイロードにデータのみが含まれるようになります(ここで、PresidentAdministration Assistantは表示属性JobTitleの値の例です)。

リクエスト

  • URL

    http://server/demo/rest/11.0/Employees/101/lov/JobsLOV?onlyData=true&fields=JobTitle

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourcecollection+json

  • ペイロード

    {
      "items" : [ {
        "JobTitle" : "President"
      }, {
        "JobTitle" : "Administration Assistant"
      }, {
        "JobTitle" : "Finance Manager"
      }, {
        "JobTitle" : "Accountant"
      }, {
        "JobTitle" : "Accounting Manager"
      }, {
        "JobTitle" : "Public Accountant"
      } ],
      "count" : 6,
      "hasMore" : false,
      "limit" : 25,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.0/Employees/101/lov/JobsLOV",
        "name" : "JobsLOV",
        "kind" : "collection"
      } ]
    }
    

22.11.2 属性のフィルタ処理による問合せ(部分取得)

ADF RESTランタイムでは、GETメソッドを使用した、リソース・コレクションからのフィールド・サブセットの取得をサポートしています。

次のサンプルは、DepartmentsコレクションとEmployeesコレクションのインスタンスの属性値をフェッチします。問合せパラメータfieldsにより、レスポンス・ペイロードには指定された属性のみが含まれるようになります。GETリクエストは、属性値を指定しないURL内のいずれのリソース値も返さない場合があることに注意してください。

最初のリクエスト(URL 1)は、Employeesコレクションのインスタンスの値をフェッチします。問合せパラメータfieldsにより、レスポンス・パラメータには指定した属性(FirstNameLastNameおよびEmail)のみが含まれるようになります。

2番目のリクエスト(URL 2)は、DepartmentsコレクションのインスタンスのDepartmentId値、および各部門の従業員のFirstName値をフェッチします。問合せパラメータonlyDataは、レスポンスをフィルタ処理して、子リンクを非表示にします。

注意:

ADF RESTリソースのバッキング・ビュー・オブジェクトで実行されるSQL SELECT文は、実行時に、ビュー・オブジェクトがどのように作成されるかに基づきます。宣言SQLモードを有効にしてADF Business Componentsデベロッパで作成するビュー・オブジェクトのみが、問合せパラメータfieldsにより命名された属性のリストのみを使用して作成した最適化されたSQL SELECT文をサポートします。非宣言ビュー・オブジェクトで実行されるSELECT文は、ビュー・オブジェクト定義のすべての属性を含みます。実行時の最適化を実現するには、ADF Business Componentsデベロッパで、宣言SQLモードのみを使用してADF RESTリソースに対するビュー・オブジェクトを作成することをお薦めします。

リクエスト1

  • URL 1

    http://server/demo/rest/11.1/Employees/101?fields=FirstName,LastName,Email

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス1

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード 1

    {
      "FirstName" : "Neena",
      "LastName" : "Smith",
      "Email" : "NSMITH",
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.1/Employees/101",
        "name" : "Employees",
        "kind" : "item"
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.1/Employees/101",
        "name" : "Employees",
        "kind" : "item"
      }, {
        "rel" : "lov",
        "href" : "http://server/demo/rest/11.1/Employees/101/lov/JobsLOV",
        "name" : "JobsLOV",
        "kind" : "collection"
      } ]
    }
    

リクエスト2

  • URL 2

    http://server/demo/rest/11.1/Departments?fields=DepartmentId;Employees:FirstName&onlyData=true

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス2

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourcecollection+json

  • ペイロード 2

    {
        "items" : [
     
            {
                "DepartmentId" : 10,
                "Employees" : [
                    {
                        "FirstName" : "Jennifer"
                    }
                ]
            },
            {
                "DepartmentId" : 20,
                "Employees" : [
                    {
                        "FirstName" : "Michael"
                    },
                    {
                        "FirstName" : "Pat"
                    }
                ]
            },
            {
                "DepartmentId" : 30,
                "Employees" : [
                    {
                        "FirstName" : "Den"
                    },
                    {
                        "FirstName" : "Alexander"
                    },
                    {
                        "FirstName" : "Shelli"
                    },
                    {
                        "FirstName" : "Sigal"
                    },
                    {
                        "FirstName" : "Guy"
                    },
                    {
                        "FirstName" : "Karen"
                    }
                ]
            },
            {
                "DepartmentId" : 40,
                "Employees" : [
                    {
                        "FirstName" : "Susan"
                    }
                ]
            },
          ...
        ],
        "count" : 25,
        "hasMore" : true,
        "limit" : 25,
        "offset" : 0,
        "links" : [
            {
                "rel" : "self",
                "href" : "http://server/demo/rest/11.0/Departments",
                "name" : "Departments",
                "kind" : "collection"
            }
        ]
    

22.11.3 行検索によるリソース・コレクションのフィルタ処理

ADF RESTランタイムでは、GETメソッドを使用してリソース・コレクションをフェッチする行検索の適用をサポートしています。ADF RESTリソース開発者は、行検索と呼ばれるシード済フィルタを定義します。ADF RESTランタイムでは、これらのフィルタにパラメータを渡すこと、およびシード済フィルタを使用してコレクションを減らす(つまりフィルタ処理する)ことをサポートしています。

行検索によるフィルタ処理は、1つ以上の行検索パラメータ値を指定するファインダ問合せ文字列を使用して実行されます。行検索問合せ文字列パラメータが含まれるファインダの形式は次のとおりです。

finder=<rowfinderName>;<attr1>=<value1>,<attr2>=<value2>,...

例: finder=DeptByName;Dname=ACCOUNTING

リソース・コレクションの記述は、行検索の形状を説明します。行検索を使用する手順は次のとおりです。

  1. リソースの記述を実行し、コレクション要素内のfinders属性を検索します。name属性は、行検索定義名を識別します。また、attributesの下の行検索パラメータの名前も検索します。

  2. 問合せパラメータfinderを含むGETを実行し、行検索名およびパラメータを渡します。

たとえば、Departmentsリソースの記述は次を返します。

"collection" : {
     "rangeSize" : 25,
     "finders" : [ {
       "name" : "EmpByEmailFinder",
       "title" : "EmployeesByEmailVC",
       "attributes" : [ {
         "name" : "Email",
         "type" : "string",
         "updatable" : true,
         "required" : "Optional",
         "queryable" : false
} ]

次のサンプルは、Email属性値NSMITHが渡される行検索EmpByEmailFinderで指定されたDepartmentsコレクションをフェッチします。

リクエスト

  • URL

    http://server/demo/rest/11.1/Employees?finder=EmpByNameFinder;Email=NSMITH

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "items" : [ {
        "EmployeeId" : 101,
        "FirstName" : "Neena",
        "LastName" : "Smith",
        "Email" : "NSMITH",
        "JobId" : "AD_VP",
        "DepartmentId" : 90,
        "Salary" : 2000,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.1/Employees/101",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.1/Employees/101",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "lov",
          "href" : "http://server/demo/rest/11.1/Employees/101/lov/JobsLOV",
          "name" : "JobsLOV",
          "kind" : "collection"
        } ]
      } ],
      "count" : 1,
      "hasMore" : false,
      "limit" : 25,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.1/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    

22.11.4 ペイロードのリソース・データのみを返す

ADF RESTランタイムでは、リソース・コレクションまたはリソース・アイテムのGETメソッドを使用した、リソース・アイテムのデータのみの取得をサポートしています。

次のサンプルは、Employeesコレクション属性の値をフェッチします。問合せパラメータonlyDataにより、表現がフィルタ処理され、レスポンス・ペイロードにデータのみが含まれ、リンクが含まれないようになります。

リクエスト

  • URL

    http://server/demo/rest/11.1/Employees?onlyData=true

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "items" : [ {
        "EmployeeId" : 101,
        "FirstName" : "Neena",
        "LastName" : "Smith",
        "Email" : "NSMITH",
        "JobId" : "AD_VP",
        "DepartmentId" : 90,
        "Salary" : 2000
      }, {
        "EmployeeId" : 102,
        "FirstName" : "Lex",
        "LastName" : "De Haan",
        "Email" : "LDEHAAN",
        "JobId" : "AD_VP",
        "DepartmentId" : 90,
        "Salary" : 3000
      }, {
        "EmployeeId" : 103,
        "FirstName" : "Alexander",
        "LastName" : "Hunold",
        "Email" : "AHUNOLD",
        "JobId" : "IT_PROG",
        "DepartmentId" : 60,
        "Salary" : 4000
      }, {
        "EmployeeId" : 104,
        "FirstName" : "Bruce",
        "LastName" : "Ernst",
        "Email" : "BERNST",
        "JobId" : "IT_PROG",
        "DepartmentId" : 60,
        "Salary" : 5000
      }, {
        "EmployeeId" : 105,
        "FirstName" : "David",
        "LastName" : "Austin",
        "Email" : "DAUSTIN",
        "JobId" : "IT_PROG",
        "DepartmentId" : 60,
        "Salary" : 6000
      } ],
      "count" : 5,
      "hasMore" : true,
      "limit" : 25,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.1/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    

22.11.5 リソース・アイテムの推定カウントを返す

ADF RESTランタイムでは、GETメソッドを使用した、リソース・コレクション内のリソース・アイテムの推定数の取得をサポートしています。

次のサンプルは、Employeesコレクションに関して推定合計結果5を返します。問合せパラメータtotalResultsにより、totalResults属性のみがレスポンス・ペイロードに含まれるようになります。

リクエスト

  • URL

    http://server/demo/rest/11.1/Employees?totalResults=true&limit=2

  • HTTPメソッド

    GET

  • コンテンツ・タイプ

    なし

  • ペイロード

    なし

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "items" : [ {
        "EmployeeId" : 101,
        "FirstName" : "Neena",
        "LastName" : "Smith",
        "Email" : "NSMITH",
        "JobId" : "AD_VP",
        "DepartmentId" : 90,
        "Salary" : 2000,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.1/Employees/NSMITH",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.1/Employees/NSMITH",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "lov",
          "href" : "http://server/demo/rest/11.1/Employees/NSMITH/lov/JobsLOV",
          "name" : "JobsLOV",
          "kind" : "collection"
        } ]
      }, {
        "EmployeeId" : 102,
        "FirstName" : "Lex",
        "LastName" : "De Haan",
        "Email" : "LDEHAAN",
        "JobId" : "AD_VP",
        "DepartmentId" : 90,
        "Salary" : 3000,
        "links" : [ {
          "rel" : "self",
          "href" : "http://server/demo/rest/11.1/Employees/LDEHAAN",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "canonical",
          "href" : "http://server/demo/rest/11.1/Employees/LDEHAAN",
          "name" : "Employees",
          "kind" : "item"
        }, {
          "rel" : "lov",
          "href" : "http://server/demo/rest/11.1/Employees/LDEHAAN/lov/JobsLOV",
          "name" : "JobsLOV",
          "kind" : "collection"
        } ]
      } ],
      "totalResults" : 5,
      "count" : 2,
      "hasMore" : true,
      "limit" : 2,
      "offset" : 0,
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.1/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    

22.11.6 カスタム・アクションの実行

ADF RESTランライムでは、POSTメソッドを使用した、リソースの基礎となるビュー・オブジェクトのクライアント・インタフェースで定義された1つ以上のカスタム・アクションの実行をサポートしています。

次のサンプルは、Employeesコレクションのインスタンスでカスタム・アクションmultiplySalaryを実行します。この場合、カスタム・アクションは基礎となるビュー・オブジェクトのビュー行クライアント・インタフェースで定義されており、このため、行レベル・インスタンスでのアクションの実行が可能になります。

リクエスト

  • URL

    http://server/demo/rest/11.1/Employees/101

  • HTTPメソッド

    POST

  • コンテンツ・タイプ

    application/vnd.oracle.adf.action+json

  • ペイロード

    {
        "name": "multiplySalary",
        "parameters": [
            {
                  "multiplicand": "2"
             }
        ]
    }

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.actionresult+json

  • ペイロード

    {
      "result" : 4000.0
    }

22.11.7 HTTPメソッドのオーバーライドおよび更新の実行

HTTPサーバーまたはクライアントによっては、HTTP仕様の一部のメソッドの公開をサポートしていない場合があります。ADF RESTランタイムでは、一般的なPOSTメソッドを使用して、他のメソッドの操作を実行できます。

次のサンプルは、POSTメソッドを使用して、PATCHメソッドのオーバーライドによりDepartmentsリソース・アイテムを更新します。

リクエスト

  • URL

    http://server/demo/rest/11.1/Departments/15

  • HTTPメソッド

    POST

  • X-HTTP-Method-Override

    PATCH

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "DepartmentName": "UpdatedDept",
    }
    

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.resourceitem+json

  • ペイロード

    {
      "DepartmentId" : 15,
      "DepartmentName" : "UpdatedDept",
      "links" : [ {
        "rel" : "self",
        "href" : "http://server/demo/rest/11.1/Departments/15",
        "name" : "Departments",
        "kind" : "item"
        }
      }, {
        "rel" : "canonical",
        "href" : "http://server/demo/rest/11.1/Departments/15",
        "name" : "Departments",
        "kind" : "item"
      }, {
        "rel" : "child",
        "href" : "http://server/demo/rest/11.1/Departments/15/child/Employees",
        "name" : "Employees",
        "kind" : "collection"
      } ]
    }
    

22.11.8 バッチ・リクエストの実行

ADF RESTランタイムでは、バッチ・リクエストを使用した、単一ラウンドトリップでの複数操作の実行をサポートしています。データは、リクエストの最後にコミットされます。ただし、バッチ・リクエスト内の1つのリクエスト部分が失敗した場合は、すべての変更がロールバックされ、エラー・レスポンスが返されます。

次のサンプルは、3つの部分の操作を実行する、成功したバッチ操作を示しています。

リクエスト

  • URL

    http://server/demo/rest

  • HTTPメソッド

    POST

  • コンテンツ・タイプ

    application/vnd.oracle.adf.batch+json

  • ペイロード

    {
        "parts": [
            {
                "id": "part1",
                "path": "/11.1/Employees/101",
                "operation": "update",
                "payload": {
                    "Salary": 10000
                }
            },
            {
                "id": "part2",
                "path": "/11.1/Employees/102",
                "operation": "update",
                "payload": {
                    "Salary": 10000
                }
            },
            {
                "id": "part3",
                "path": "/11.1/Employees/103",
                "operation": "update",
                "payload": {
                    "Salary": 10000
                }
            }
        ]
    }
    

レスポンス

  • HTTPコード

    200

  • コンテンツ・タイプ

    application/vnd.oracle.adf.batch+json

  • ペイロード

    {"parts": {
          {
            "id" : "part1",
            "path" : "/11.1/Employees/101",
            "operation" : "update",
            "payload" : {
                "EmployeeId" : 101,
                "FirstName" : "Neena",
                "LastName" : "Smith",
                "Email" : "NSMITH",
                "JobId" : "AD_VP",
                "DepartmentId" : 90,
                "Salary" : 10000,
            "links" : [ {
                 "rel" : "self",
                 "href" : "http://server/demo/rest/11.1/Employees/101",
                 "name" : "Employees",
                 "kind" : "item"
            }, {
                 "rel" : "canonical",
                 "href" : "http://server/demo/rest/11.1/Employees/101",
                 "name" : "Employees",
                 "kind" : "item"
            }, {
                 "rel" : "lov",
                 "href" : "http://server/demo/rest/11.1/Employees/101/lov/JobsLOV",
                 "name" : "JobsLOV",
                 "kind" : "collection"
            } ]
            }
          }, {
            "id" : "part2",
            "path" : "/11.1/Employees/102",
            "operation" : "update",
            "payload" : {
                "EmployeeId" : 102,
                "FirstName" : "Lex",
                "LastName" : "De Haan",
                "Email" : "LDEHAAN",
                "JobId" : "AD_VP",
                "DepartmentId" : 90,
                "Salary" : 10000,
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.1/Employees/102",
              "name" : "Employees",
              "kind" : "item"
             }, {
              "rel" : "canonical",
              "href" : "http://server/demo/rest/11.1/Employees/102",
              "name" : "Employees",
              "kind" : "item"
            }, {
              "rel" : "lov",
              "href" : "http://server/demo/rest/11.1/Employees/102/lov/JobsLOV",
              "name" : "JobsLOV",
              "kind" : "collection"
            } ]
            }
          }, {
            "id" : "part3",
            "path" : "/11.1/Employees/103",
            "operation" : "update",
            "payload" : {
                "EmployeeId" : 103,
                "FirstName" : "Alexander",
                "LastName" : "Hunold",
                "Email" : "AHUNOLD",
                "JobId" : "IT_PROG",
                "DepartmentId" : 60,
                "Salary" : 10000,
            "links" : [ {
              "rel" : "self",
              "href" : "http://server/demo/rest/11.1/Employees/103",
              "name" : "Employees",
              "kind" : "item"
            }, {
              "rel" : "canonical",
              "href" : "http://server/demo/rest/11.1/Employees/103",
              "name" : "Employees",
              "kind" : "item"
            }, {
              "rel" : "lov",
              "href" : "http://server/demo/rest/11.1/Employees/103/lov/JobsLOV",
              "name" : "JobsLOV",
              "kind" : "collection"
            } ]
          }
          } ]
    }

22.12 ADF RESTフレームワーク・リファレンス

ADF RESTフレームワークでは、HTTPメソッド、HTTPヘッダー、リクエストURLパラメータ、メディア・タイプおよびその他の概念をサポートして、リソースに対するREST APIコールの作成を可能にしています。

22.12.1 ADF RESTペイロード圧縮のサポート

サーバーとクライアント間で交換されるHTTPペイロードをエンコードできます。この機能は、クライアントがサービス・リクエストでAccept-Encoding: gzipヘッダーまたはContent-Encodingヘッダーを指定した場合に有効になります。

リソースのエンコーディング・サポートを無効化するには、カスタム・プロパティadf.rest.enablecompressionfalseに設定します。JDeveloperでは、このプロパティはFusion WebアプリケーションのADF構成ファイル(adf-config.xml)で設定されています。

表22-3は、ADF RESTフレームワークでサポートされているコンテンツ・エンコーディング・トークンを示しています。


表22-3 サポートされているコンテンツ・エンコーディング・トークン

コンテンツ・エンコーディング 説明

identity

ペイロードを圧縮しません。動作は、エンコーディングが省略されている場合と同じです。

x-gzipおよびgzip

RFC 1952 [25]で説明されているように、ファイル圧縮プログラムgzip (GNU zip)で生成される形式を使用してペイロードを圧縮します。この形式は、32ビットCRCを使用するLempel-Zivコーディング(LZ77)です。

deflate

FRC 1950 [31]で定義されているzlib形式と、RFC 1951 [29]で説明されているdeflate圧縮メカニズムを組み合せて使用して、ペイロードを圧縮します。


22.12.2 ADF RESTメディア・タイプ

MIMEタイプまたはコンテンツ・タイプとも呼ばれるメディア・タイプは、クライアントとサーバー間で交換されるペイロードの使用可能なリソース構造を定義します。すべてのADF RESTメディア・タイプはJSONに基づいています。クライアント・アプリケーションでアクセスされるリソースは、applicationタイプとjsonサブタイプに分類されます。

REST APIを起動するサービス・クライアントは、表22-4にリストされているいずれかのメディア・タイプを使用してRESTful Webサービスと対話します。これらのタイプでは、リソースの基礎となるビュー・オブジェクト定義によってメディア・タイプが変わらないことが定義されています。acceptヘッダーの値は、起動のコンテキストに応じて変わることに注意してください。ADF RESTフレームワーク・メディア・タイプのJSONトークン構造へのリンクを次の表に示します。

注意:

サポートされているメディア・タイプを指定するかわりに、サービス・クライアント・リクエストのacceptヘッダーは、サポートされるすべてのメディア・タイプのスーパーセットがレスポンスで受け入れられる場合にapplication/jsonを指定できます。


表22-4 ADF RESTフレームワークでサポートされるメディア・タイプ

メディア・タイプ 起動コンテキスト 説明

application/vnd.oracle.adf.resourcecollection+json

GETメソッド

POSTメソッド

ADF RESTランタイムで返されるすべてのリソース・コレクションの形式を表します。

すべての属性がフレームワークにより自動的に生成されます。items属性のコンテンツのみがリソース定義に基づいています。

例については、「リソース・コレクションの記述」を参照してください。

application/vnd.oracle.adf.resourceitem+json

GETメソッド

POSTメソッド

DELETEメソッド

PATCHメソッド

ADF RESTランタイムで返されるすべてのリソース・アイテムの形式を表します。

属性linksのみがフレームワークにより自動的に生成されます。その他のすべて属性は、リソース定義に基づいています。

例については、「リソース・アイテムの記述」を参照してください。

application/vnd.oracle.adf.action+json

POSTメソッド

カスタム・アクション実行およびそれらのパラメータを記述します。

公開されたカスタム・アクションは、ビュー・オブジェクト・インタフェースまたはビュー行インタフェースのメソッドが基礎となっています。

例については、「カスタム・アクションの実行」を参照してください。

application/vnd.oracle.adf.actionresult+json

POSTメソッド

アクションの実行結果を記述します。

例については、「カスタム・アクションの実行」を参照してください。

application/vnd.oracle.adf.description+json

GETメソッド

リソースおよびその要素を記述します。

例については、「使用可能なすべてのリソースの記述」を参照してください。

application/vnd.oracle.adf.batch+json

POSTメソッド

実行される一連の操作を記述します(操作は部分のセットで構成され、各部分はリクエストを表します)。バッチ・リクエストは、単一のトランザクションで実行されます。

例については、「バッチ・リクエストの実行」を参照してください。

application/vnd.oracle.adf.version+json

GETメソッド

すべてのバージョンのリソースを取得するリクエストの結果を記述します。

例については、「使用可能なすべてのバージョン・リリース名の取得」を参照してください。


22.12.3 ADF RESTデータ型

ADF RESTデータ型は、ADF RESTフレームワークによってADF RESTリソース・アイテムとそれらの基礎となるADFビジネス・コンポーネント・エンティティ・オブジェクト属性との間でマップされます。実行時に、フレームワークは、フェッチされたADF RESTリソース・アイテムのデータ型を記述属性typeとして公開します。

表22-5は、ADF RESTリソースのビュー・オブジェクトの基礎となるエンティティ・オブジェクト属性でサポートされているADFビジネス・コンポーネント・データ型と、ADF RESTフレームワークが定義するADF RESTデータ型との間の関係を示しています。一般に、フレームワークではリソース・アイテムの基礎となる属性のSQLタイプに基づいてADF RESTリソース・アイテムのデータ型を定義しますが、次の2つの例外があります。

  • 基礎となる属性がブール型マップとして定義されている場合、ADF RESTタイプは常にブールになります。

  • 基礎となる属性のJavaタイプがblobまたはclobである場合、ADF RESTタイプは添付ファイルになります。


表22-5 ADF RESTフレームワークでサポートされるデータ型

ADFの基礎となる属性 ADF RESTデータ型

属性が次のいずれかの型マップで構成される場合:

oracle.jbo.valuemaps.Boolean10PropertySet

oracle.jbo.valuemaps.BooleanTFPropertySet

oracle.jbo.valuemaps.BooleanYNPropertySet

boolean

Javaクラス: oracle.jbo.domain.ClobDomainまたは

oracle.jbo.domain.BlobDomain

将来のリリースではSQLタイプがJavaクラスのかわりに使用されることに注意してください。

attachment
SQLタイプ: Char string
SQLタイプ: Number

integer

桁数が指定されていないため、将来のリリースでこのADF RESTタイプはnumberに変更されることに注意してください。

SQLタイプ: Number (precision = *、scale > 0) number
SQLタイプ: Number (precision < 10、scale = 0) integer
SQLタイプ: Number (precision >= 10、scale = 0)

integer

整数が9桁を超えることはないため、将来のリリースでこのADF RESTタイプはnumberに変更されることに注意してください。

SQLタイプ: Date

string

将来のリリースでこのADF RESTタイプはdateに変更されることに注意してください。


22.12.4 ADF REST HTTPコード

ADF RESTフレームワークでは、次の表にリストされているHTTPコードをサポートしています。返される特定のコードは、Webサービスで起動されたHTTPメソッドによって異なります。


表22-6 ADF RESTフレームワークでサポートされているHTTPコード

HTTPコード 説明

200 OK

リクエストが正常に実行され、レスポンスにコンテンツが含まれます。

201 Created

リソースが正常に作成されました。レスポンスには作成されたリソースが含まれます。

204 No Content

リクエストが正常に実行され、レスポンスにはコンテンツが含まれません。

304 Not Modified

指定されたETagに応じて、リソースは変更されませんでした。

400 Bad Request

構文の形式が正しくないため、サーバーがリクエストを理解できませんでした。

401 Unauthorized

リクエストのリソースがセキュリティによって保護されており、認証がまだ提供されていないため、サーバーはリクエストの処理を拒否しています。

404 Not Found

リクエストされたリソースが見つかりませんでした。

406 Not Acceptable

リクエストによって識別されたリソースは、リクエストで送信されたAcceptヘッダーによって受入れ不可となったコンテンツ特性を含むレスポンス・エンティティを生成することのみが可能です。

412 Precondition failed

サーバー側のリソース状態は指定されたETagと一致しません。

415 Unsupported Media Type

リクエストされたメソッドに対するリクエストのエンティティが、リクエストされたリソースではサポートされていない形式であるため、サーバーはリクエストの処理を拒否しています。

500 Internal Server Error

サーバーに予期しない状況が発生し、リクエストを遂行できなくなりました。


22.12.5 ADF REST HTTPヘッダー・サポート

ADF RESTフレームワークでは、次の表にリストされているHTTPヘッダーをサポートしています。


表22-7 ADF RESTフレームワークでサポートされているHTTPヘッダー

HTTPヘッダー名 説明

Content-Type

リクエスト/レスポンス・ペイロードのコンテンツ・タイプを指定するために使用します。ADF RESTランタイムでは、「ADF RESTメディア・タイプ」で説明しているように、メディア・タイプを解釈(リクエスト/レスポンス)できます。

Content-Encoding

リクエスト/レスポンス・ペイロードのコンテンツ・エンコーディングを指定するために使用します。ADF RESTランタイムでは、「ADF RESTペイロード圧縮のサポート」で説明しているように、エンコーディングを使用する圧縮リクエストを解析できます。

Accept

レスポンス・ペイロードの予期されたコンテンツ・タイプを指定するために使用します。ADF RESTランタイムでは、「ADF RESTメディア・タイプ」で説明しているように、メディア・タイプを解釈(リクエスト/レスポンス)できます。

Accept-Encoding

許容されるエンコード・レスポンスのリストを指定するために使用します。ADF RESTフレームワークは、「ADF RESTペイロード圧縮のサポート」で説明しているエンコーディングを使用してレスポンスを生成できます。

Location

新たに作成されたリソースのURIを識別するために使用します。ADF RESTフレームワークには、新しいリソースを作成するPOSTのレスポンスにLocationヘッダーが含まれています。例については、「コレクションでのリソース・アイテムの作成」を参照してください。

ETag

リクエスト内のリソースの状態を、サーバー上のリソースの状態と比較するために使用します。ADF RESTフレームワークでは、更新識別子属性を使用するように構成されたADFビジネス・コンポーネント・エンティティ・オブジェクトが基礎となるリソースのETagの生成をサポートしています。詳細は、「データ整合性のチェック」を参照してください。

If-Match

リクエスト内のリソースの状態が、サーバー上のリソースの最新状態であるかどうかを識別するために使用します。このヘッダーは、条件付きリクエストを実行するためにサポートされています。詳細は、「データ整合性のチェック」を参照してください。

If-None-Match

リクエスト内のリソースの状態が、サーバーでの現在の状態に一致しないかどうかを識別するために使用します。このヘッダーは、条件付きリクエストを実行するためにサポートされています。詳細は、「データ整合性のチェック」を参照してください。

X-HTTP-Method-Override

サーバーでサポートされていないアクションを実行するために使用します。これは、(HTTP仕様で定義されていない)カスタム・ヘッダーであり、HTTPメソッドの名前がその値として含まれます。この値(有効な場合)は、使用されるHTTPメソッドの定義に使用されます。このヘッダーはPOSTリクエストでのみ考慮されます。詳細は、「HTTPメソッドのオーバーライドおよび更新の実行」を参照してください。

Cache-Control

フレームワーク・ペイロードをキャッシュ/格納する中間プロキシを回避するために使用し、このヘッダーはすべてのHTTPレスポンスに構成されます。有効な値はno-cacheno-storeおよびmust-revalidateです。


22.12.6 ADF REST HTTPメソッドおよびペイロードのサポート

ADF RESTフレームワークでは、次のHTTPメソッドでの操作をサポートしています。

  • GET

  • POST

  • PATCH

  • DELETE

22.12.6.1 GETメソッドの操作

ADF RESTフレームワークでは、GETメソッドを使用した、次に示すURIを含む次の操作をサポートしています。

  • リソース・コレクション、リソース・アイテム、またはリソース・コレクションやリソース・アイテムが省略されている場合はリソース・カタログを記述します。

    http://server/demo/rest/{version}/[{resourceCollectionPath}|{resourceItemPath}]/describe
    
  • 問合せ文字列パラメータを含む、または含まないリソース・コレクション表現を取得します。

    http://server/demo/rest/{version}/{resourceCollectionPath}[?{queryStringParam}[&{queryStringParam}]]
    
  • 問合せ文字列パラメータを含む、または含まないリソース・アイテム表現を取得します。

    http://server/demo/rest/{version}/{resourceItemPath}[?{queryStringParam}[&{queryStringParam}]]
    
  • 特定のバージョンのリソース・コレクション、最新のリソース・バージョン、またはバージョン識別子やリソース・コレクションが省略されている場合は使用可能なすべてのリソースを取得します。

    http://server/demo/rest/[{version}|latest/{resourceCollectionPath}]
    

リクエスト・パラメータ

  • GETメソッドでは、リソース表現の問合せ、フィルタ処理、ページングおよびソートを実行する問合せ文字列パラメータをサポートしています。サポートされているパラメータを次の表に示します。GETメソッドのすべてのURIパラメータは、表内の他の任意のパラメータと組み合せることができますが、expandパラメータとfieldパラメータには例外が記載されています。問合せ文字列パラメータはリソース・メディア・タイプでのみ使用できることに注意してください。たとえば、リソースの記述時には使用できません。


表22-8 サポートされているリソース・メディア・タイプのGETメソッド問合せ文字列パラメータ

GET URIパラメータ リソース・タイプ(アイテム/コレクション) 説明

q

リソース・コレクションのみ

セミコロンで区切られた1つ以上の式。

形式: <exp1>;<exp2>

例: ?q=Deptno>=10 and <= 30;Loc!=NY

指定された式を使用して、リソース・コレクションの問合せが実行されます。

サポートされる演算子:

  • より大きい: >

  • より小さい: <

  • 以上: >=

  • 以下: <=

  • 論理積: AND

  • 論理和: OR

    注: ORは、指定された検索フィールドの値間でのみ使用できます。検索フィールド間の結合として使用することはできません。

  • 等価: =

  • 相似: LIKE

特殊文字:

  • リテラルの定義: "または' (一重引用符または二重引用符)

  • エスケープ: \

  • ワイルドカード: *

例については、「問合せパラメータによるリソース・コレクションのフィルタ処理」を参照してください。

finder

リソース・コレクションのみ

ファインダおよびそのパラメータに関する情報を含む式。

形式: <finder>;<param1>=<val1>,<param2>=<value2>

例: ?finder=DeptByName;Dname=ACCOUNTING

指定されたファインダ/パラメータを使用して、リソース・コレクションの問合せが実行されます。使用可能なファインダのリストが記述で提供されます。

タイプがchardateまたはnumberに属していないパラメータを含むファインダは除去されます。

例については、「行検索によるリソース・コレクションのフィルタ処理」を参照してください。

fields

両方

リソース・アイテム属性の単純なカンマ区切りリスト。

形式: <attr1>,<attr2>

例: ?Dname,DLoc

子リソースに対して使用できます。

形式: <accessor>:<att1>,<att2>

例: ?fields=Employees:FirstName,LastName

このパラメータは、リソース・アイテム属性をフィルタ処理します。指定した属性のみが返されます。

現在、第1レベルの子のみをフィルタ処理できることに注意してください。

このパラメータはexpandパラメータと結合できないことに注意してください。両方のパラメータが指定された場合は、fieldsのみが考慮されます。

例については、「属性のフィルタ処理による問合せ(部分取得)」を参照してください。

onlyData

両方

ブール

デフォルト: false

この表現は、データのみを含める(たとえば、linksオブジェクトを含めない)ためにフィルタ処理されます。

例については、「ペイロードのリソース・データのみを返す」を参照してください。

totalResults

リソース・コレクションのみ

ブール

デフォルト: false

totalResults=trueの場合、リソース・コレクション表現には推定の行カウントが含まれます。

例については、「リソース・アイテムの推定カウントを返す」を参照してください。

expand

両方

すべての子を表示します。形式: all

アクセッサのカンマ区切りリストを使用して、複数の子リソースを表示します。

形式: <accessor1>,<accessor2>

例: ?expand=Employees,Localizations

このパラメータが指定されている場合は、(リンクではなく)指定された子がリソース・ペイロードに含まれます。

現在、第1レベルの子のみを展開できることに注意してください。

expandfieldsパラメータと結合できないことに注意してください。両方のパラメータが指定された場合は、fieldsのみが考慮されます。

例については、「ネストされた子リソースのフェッチ」を参照してください。

limit

リソース・コレクションのみ

整数

デフォルト: ADF RESTリソース定義ファイルのイテレータ・バインディングRangeSizeプロパティ。

このパラメータは、リソース・コレクション内に返されるリソース数を制限します。この制限がリソースの合計結果を超える場合、フレームワークは使用可能なリソースを返します。

例については、「リソース・コレクションのページング」を参照してください。

offset

リソース・コレクションのみ

整数

デフォルト: 0 (最初の位置)

リソース・コレクションの開始位置の定義に使用されます。offsetがリソース数より大きい場合、リソースは返されません。

例については、「リソース・コレクションのページング」を参照してください。

dependency

両方

依存属性のセット。

形式: <attr1>=<val1>,<attr2>=<value2>

例: dependency=ProductId=2

依存性は、レスポンス生成の前に設定され、レスポンス生成の後にロールバックされる属性です。一般に、LOV有効属性のカスケードに適用されるため、属性変更の影響をプレビューするために使用されます。依存属性は、該当するリソース・アイテムで常に設定されます。

子リソース・コレクションがリクエストされた場合、dependencyパラメータが設定されていると、リソース・コレクション・ペイロードが生成される前に、属性は親リソースで設定されます。

orderBy

両方

昇順または降順を指定するソート・フラグが含まれるorder-by属性のカンマ区切りリスト。

形式: <orderBy_attr1_name>[:<(asc/desc)>]<orderBy_attr2_name>[:<(asc/desc)>]

例: ?DName:asc,DLoc

デフォルト: リソースの基礎となるビュー・オブジェクト問合せで定義されているORDERBY属性が適用されます。

リソース・コレクションをその属性に基づいて順序付けします。asc/descが指定されていない(または無効な値が指定されている)場合、ascがデフォルトとして使用されます。

例については、「リソース・コレクションのソート」を参照してください。

       

22.12.6.2 POSTメソッドの操作

ADF RESTフレームワークでは、POSTメソッドを使用した、次に示すURIを含む次の操作をサポートしています。

  • 新しいリソースを作成します。

    http://server/demo/rest/{version}/{resourceCollectionPath}
    
  • リソース・コレクションまたはリソース・アイテムに対するアクションを実行します。

    http://server/demo/rest/{version}/{resourceCollectionPath}|{resourceItemPath}
    
  • バッチ・リクエストを実行します。

    http://server/demo/rest/{version}/{resourceCollectionPath}
    

リクエスト・パラメータ

  • なし

サポートされているメディア・タイプ

  • リクエスト

    • application/vnd.oracle.adf.resourceitem+json: リソースを作成する場合、またはHTTPメソッドをオーバーライドして更新を実行する場合。

    • application/vnd.oracle.adf.action+json: アクションを実行する場合。

    • application/vnd.oracle.adf.batch+json: バッチ・リクエストを実行する場合。

  • レスポンス

    • application/vnd.oracle.adf.resourceitem+json: アクションを実行する場合、またはリソースを作成する場合。

    • application/vnd.oracle.adf.actionresult+json: オブジェクトを返すアクションを実行する場合。

    • application/vnd.oracle.adf.batch+json: バッチ・リクエストを実行する場合。

ユースケースのサンプル

22.12.6.3 PATCHメソッドの操作

ADF RESTフレームワークでは、PATCHメソッドを使用した、次に示すURIを含む次の操作をサポートしています。

  • リソース・アイテムの更新。

    http://server/demo/rest/{version}/{resourceItemPath}
    

リクエスト・パラメータ

  • なし

サポートされているメディア・タイプ

  • リクエスト

    • application/vnd.oracle.adf.resourceitem+json: 更新されるリソース・アイテム。

  • レスポンス

    • application/vnd.oracle.adf.resourceitem+json: 更新されたリソース・アイテム。

ユースケースのサンプル

22.12.6.4 DELETEメソッド

ADF RESTフレームワークでは、DELETEメソッドを使用した、次に示すURIを含む次の操作をサポートしています。

  • リソース・アイテムを削除します。

    http://server/demo/rest/{version}/{resourceItemPath}
    

リクエスト・パラメータ

  • なし

サポートされているメディア・タイプ

  • リクエスト

    • なし

  • レスポンス

    • なし

ユースケースのサンプル