44 JavaアプリケーションからのRESTfulサービスへのアクセスおよびRESTペイロードの管理

Oracle Application Development Framework (ADF)を使用して、(JSONペイロードの使用によって) RESTful Webサービスを消費するカスタムJavaアプリケーションを作成します。この方法を使用して、ADFアプリケーションをOracle Sales CloudなどのOracle SaaSアプリケーションと統合できます。

一般的な概要

Oracle Application Development Framework (ADF)を使用してJavaアプリケーションからRESTfulサービスにアクセスするには、データ操作のためにJSONペイロードをPOJOに変換するためにJacksonライブラリを使用する、汎用のADFアプリケーションを作成します。その後、Jerseyクライアント・ライブラリを使用して、Webサービス・エンドポイントにアクセスし、様々なREST操作を使用します。

前提条件

このドキュメントに示される開発の例を実行する前に、以下の点に注意してください。

  • JDeveloper 11.1.1.7.1にはJavaバージョン6 (SEまたはEE)が必要であるため、必ずこのバージョンを実行してください。

  • Oracle JDeveloperバージョン11.1.1.7.1がインストールされていることを確認してください。アプリケーションをJCS - SaaS Extensionにデプロイする場合、この作業が必要です。

    注意:

    Oracle JDeveloper IDEを使用してOracle Cloudで開発するには、Oracle JDeveloper Studio Editionバージョン11.1.1.7.1を使用する必要があります。これより新しいバージョンを含む他のOracle JDeveloperのバージョンの場合、Oracle Cloudの統合機能をサポートしていません。Oracle JDeveloper Studio Edition 11.1.1.7.1をOracle Technology Network (http://www.oracle.com/technetwork/developer-tools/jdev/downloads/jdeveloer111171-2183166.html)からダウンロードしてください。

Oracle JDeveloper 11.1.1.7.1でのRESTのサポートについて

JDeveloper 11.1.1.7.1の場合、RESTfulサービスは、SOAPサービスの場合とは異なり、ウィザードからは生成されません。ただし、後でJerseyやJacksonなどの外部ライブラリを使用して、JAX-RS実装の処理やJSONペイロード構造の管理を行います。Jerseyライブラリを使用してRESTful Webサービスと対話したり、Jackson注釈を使用してPOJOを構築することによってサービスのJSONレスポンスを処理したりします。

RESTの制約

RESTの制約は、RESTアーキテクチャ・スタイルの個別の特性を確立するために適用される主要な設計ルールです。これらすべての制約に従うことにより、システムがRESTfulであると見なされます。

  • クライアント/サーバー: この制約により、クライアントとサーバーが疎結合された状態を維持します。クライアントはサーバーの実装の詳細を認識する必要がなく、サーバーはクライアントによるデータの使用方法を気にしなくてすみます。

  • ステートレス: セッションが存在しません。各リクエストは互いに独立しています。

  • キャッシュ可能: キャッシュは、クライアントとサーバーの間で繰り返されるラウンドトリップを回避する上で役に立ちます。

  • 統一インタフェース: クライアントによって使用されるために公開された各リソースは、アドレスが一意であるとともに、汎用インタフェースを介してアクセスできる必要があります。HTTPプロトコルを使用してRESTfulリソースにアクセスする場合、リソース識別子はリソースのURLであり、そのリソースに対して実行される標準操作は、HTTPメソッド(GETPUTDELETEPOSTまたはHEAD)の1つです。

  • レイヤー・システム: レイヤー・アーキテクチャを使用すると、スケーラビリティ、パフォーマンスおよびセキュリティが向上しやすくなります。

  • コード・オンデマンド: この制約はオプションです。これにより、クライアントがサーバーからコードをダウンロードして実行できるようになります。

REST動詞

RESTfulアーキテクチャは、標準のCRUD (Create (作成)、Read (読取り)、Update (更新)およびDelete (削除))操作を提供する必要があります。これらの操作は、標準のHTTPプロトコル・メソッドにマップされています。

  • POST — 作成操作に使用します

  • GET — 読取り操作に使用します

  • PUTまたはPATCH — 更新操作に使用します

  • DELETE — 削除操作に使用します

Oracle Sales Cloud RESTful APIでのこれらの操作の詳細は、「REST操作およびペイロード構造について」を参照してください。

Jersey JAX-RS参照実装API

Jerseyは、JavaでRESTful Webサービスを実装するためのAPIであるJAX-RSの参照実装です。JerseyクライアントAPIは、RESTful Webサービスと対話するための高度なJavaベースのAPIです。JerseyクライアントAPIの目的は、上記の統一インタフェース制約とその関連データ要素をクライアント側のJavaアーティファクトとしてカプセル化することです。

JerseyクライアントAPI内のソースは、URIをカプセル化するJavaクラスWebResourceのインスタンスです。HTTPメソッドの固定セットは、WebResourceに対するメソッドです。

また、Jersey JAX-RS RI APIを使用して、JavaアプリケーションでRESTful Webサービスを作成することもできます。「JDeveloperを使用したRESTful Webサービスの作成」を参照してください。

RESTfulサービスにアクセスするためのADF Javaアプリケーションの作成

JavaアプリケーションからRESTful Webサービスにアクセスするには、最初に、RESTful Webサービスを処理するためのライブラリ(JAX-RS)を組み込むADFプロジェクトをJDeveloper 11.1.1.7.1から作成する必要があります。

JDeveloper 11.1.1.7.1でADFアプリケーションを作成する手順:
  1. JDeveloperで「ファイル」メニューをクリックしてから、「新規」オプションを選択します。「一般」→「アプリケーション」で、Fusion Web Application (ADF)を選択します。
  2. アプリケーションの名前を入力し、「Next」をクリックします。
  3. Modelプロジェクトの名前を入力し、「Next」をクリックします。
  4. Modelのプロジェクトの「デフォルト・パッケージ」の名前を入力し、「Next」をクリックします。
  5. ViewControllerプロジェクトの場合、デフォルト・オプションのままにし、「Next」をクリックします。
  6. Modelのプロジェクトの「デフォルト・パッケージ」の名前を入力し、「終了」をクリックします。
    これで、ModelプロジェクトおよびViewControllerプロジェクトとデフォルト設定を使用してADFデフォルト・アプリケーションがJDeveloperで作成されました。

Oracle Sales Cloud SSL RESTful WebサービスにアクセスするためのJDeveloperキーストアの構成

ローカル開発環境内のOracle Sales CloudリモートSSL RESTful Webサービスにアクセスするには、RESTful SSLサービス証明書を使用してJDeveloperを構成する必要があります。このタスクでは、Oracle Sales Cloud SSL証明書をJDeveloperキーストアに追加します。

JDeveloperでOracle Sales Cloud SSL証明書を構成するには、ログインしていることを最初に確認してから、次の手順を実行します。
  1. WebブラウザでOracle Sales CloudインスタンスのRESTful APIリソースのURLを指定します。たとえば、FirefoxでOpportunitiesリソースにアクセスするには、次を開きます。

    https://<my-crm-server>:<crm-port>/salesApi/resources/latest/opportunities/

  2. ブラウザのナビゲーション・バーに表示されたSSLアイコン(たとえば、Firefoxの場合、鍵アイコンとして表示されます)をクリックしてから、下図に示すように「詳細を表示」をクリックします。
  3. 「セキュリティ」タブにある「証明書を表示」ボタンをクリックしてから、「詳細」タブをクリックします。
  4. 「エクスポート」ボタンをクリックします。ファイルに.crt拡張子を付けて目的の場所に保存します。
  5. JDeveloperで、「ツール」メニューをクリックし、「プリファレンス」を選択します。
  6. 「資格証明」をクリックし、下図に示すようにクライアントの信頼できる証明書キーストア・ファイルを探します。
  7. 管理権限を使用してコマンド・プロンプトを開きます(Windowsの場合、cmdを実行し、[Ctrl]キーと[Shift]キーを押してから[Enter]を押します)。
  8. JREのインストール・フォルダ、その/binフォルダの順にナビゲートし、次のコマンドを実行します。
    keytool -importcert -noprompt -trustcacerts -alias YOUR_FILE_NAME -file  PATH_TO_THE_CERT_FILE_YOU_DOWNLOADED -keystore PATH_TO_THE_JDEVELOPER_KEYSTORE -storepass DemoTrustKeyStorePassPhrase

    YOUR_FILE_NAMEは、選択する任意の名前です。PATH_TO_THE_CERT_FILE_YOU_DOWNLOADEDは、手順8でダウンロードした証明書ファイルへのパスです。PATH_TO_THE_JDEVELOPER_KEYSTOREは、手順10のJDeveloperキーストアへのパスです。DemoTrustKeyStorePassPhraseは、デフォルトのDemoTrust.jks (クライアントの信頼できる証明書キーストア)のテキスト形式のパスフレーズです。

ローカル開発環境にOracle Sales Cloudの証明書が正常に追加されました。これを使用して、Javaアプリケーションをローカルで開発およびテストできます。

JavaプロジェクトへのJerseyライブラリの追加

Jerseyは、JAX-RS 1.1の参照実装です。これは、単純な注釈の使用を介してJava EEでRESTアーキテクチャ・スタイルを昇格する一連のAPIを定義する、オープン・ソース・プロジェクトです。

上記のタスクで作成したJavaプロジェクトにJersey 1.19ライブラリをインストールします。
  1. 最新のJersey 1.19 JARバンドルをhttps://jersey.java.net/download.htmlからダウンロードします。
  2. ダウンロードしたJARファイルをJavaプロジェクト内の public_html\WEB-INF\libフォルダに配置します(フォルダが存在しない場合は作成します)。

    注意:

    Jerseyライブラリと public_html\WEB-INF\libのフォルダが、JDeveloper内のみでなく、物理ファイル・システム内にも追加されていることを確認します。
  3. これをJavaプロジェクトに追加するには、プロジェクト名AccountWSProjectを右クリックし、コンテキスト・ウィンドウから「プロジェクト・プロパティ」を選択します。
  4. 「ライブラリとクラスパス」で、「ライブラリの追加」ボタンをクリックします。
  5. 「ライブラリの追加」ウィンドウで、「新規」ボタンをクリックします。
    「ライブラリの作成」という名前の別のウィンドウが開きます。
  6. 「ライブラリの作成」ウィンドウで、「ライブラリ名」フィールドの下に「Jersey 1.19」と入力します。
  7. 「クラスパス」フィールドをクリックしてから、「エントリの追加」ボタンをクリックします。Javaプロジェクト内のpublic_html\WEB-INF\libフォルダの下でJARファイルの場所を選択します。
  8. 「選択」ボタンをクリックします。次に、「ライブラリとクラスパス」ウィンドウに戻るまで「OK」ボタンをクリックします。
    新しく作成したレイアウトが「クラスパス・エントリ」の下に表示されます。

    libraries-and-classpath-window-jersey-jpg.jpgの説明が続きます
    図libraries-and-classpath-window-jersey-jpg.jpgの説明

  9. 「OK」ボタンをクリックします。
    JavaプロジェクトにJerseyが追加されました。

JavaプロジェクトへのJacksonライブラリの追加

Jacksonライブラリは、注釈を使用してJSONオブジェクトをJava POJOクラスに変換するために使用できる、高パフォーマンスのJSON処理ライブラリです。

JavaプロジェクトにJacksonライブラリを追加する手順:
  1. Jacksonライブラリをhttp://wiki.fasterxml.com/JacksonDownloadからダウンロードします。
  2. ダウンロードしたJARファイルをViewController Javaプロジェクト内の public_html\WEB-INF\libフォルダに配置します(フォルダが存在しない場合は作成します)。

    注意:

    ライブラリとフォルダがファイル・システム内にも追加されていることを確認します。
  3. Jacksonライブラリを追加するには、プロジェクト名Modelを右クリックし、コンテキスト・ウィンドウから「プロジェクト・プロパティ」を選択します。
  4. 「ライブラリとクラスパス」で、次に示すように「ライブラリの追加」ボタンをクリックします。
  5. 「ライブラリの追加」ウィンドウで、「新規」ボタンをクリックします。
    「ライブラリの作成」という名前の別のウィンドウが開きます。
  6. 「ライブラリの作成」ウィンドウで、次に示すように、「ライブラリ名」フィールドに「Jackson 1.x」と入力します。「x」は、ダウンロードしたバージョン番号です。
  7. 「クラスパス」フィールドをクリックしてから、「エントリの追加」ボタンをクリックします。ViewController Javaプロジェクト内のpublic_html\WEB-INF\libフォルダの下でJARファイルの場所を選択します。
  8. 「選択」ボタンをクリックします。次に、「ライブラリとクラスパス」ウィンドウに戻るまで「OK」ボタンをクリックします。
    次に示すように、新しく作成したレイアウトが「クラスパス・エントリ」の下に表示されます。

    jackson-lib.jpgの説明が続きます
    図jackson-lib.jpgの説明
  9. 「OK」ボタンをクリックします。
    JavaプロジェクトにJacksonライブラリが追加されました。

JSONを使用してRESTレスポンスを処理するためのPOJOの構築

Jacksonライブラリを使用して、RESTful APIリソースのJSONスキーマに基づいてPOJOを構築できます。

特定のJSONレスポンスに必要なPOJOクラスを構築する手順:
  1. Oracle Sales Cloudにサインイン(してRESTサービス・エンドポイントにアクセス)します。
  2. WebブラウザでAPIリソースのURLを指定します。たとえば、Opportunitiesリソースに対する特定のリクエストのPOJOを構築するには、次のようにします。
    https://>crm_server:PortNumber</salesApi/resources/latest/opportunities/?q=OptyId=300000000845411&fields=Revenue,OptyId,OptyNumber,EmailAddress,PartyName1&onlyData=true

    >crm_server:PortNumber<は、Oracle Sales CloudインスタンスのURLおよびポート番号です。

  3. サーバーからのレスポンスは、次に示すようなJSON構造になります。太字で強調表示された主要なJSONオブジェクト・ツリー構造に注意してください。
    { "items" : [ { "OptyId" : 000000000000000, "OptyNumber" : "19005", "Revenue" : 0, "PartyName1" : "John Doe", "EmailAddress" : "john.doe@abcxyz.com" } ], "count" : 1, "hasMore" : false, "limit" : 25, "offset" : 0, "links" : [ { "rel" : "self", "href" : "https://>crm_server:PortNumber</salesApi/resources/11.1.10/opportunities", "name" : "opportunities", "kind" : "collection" } ] }
  4. JDeveloperで、JSONオブジェクトからノードごとにPOJO Javaクラスを作成します。上記の例の場合、Opportunity.java (外部ノード)、Item.java (items内のノード)、 Link.java (links内のノード)の3つのクラスが作成されます。Opportunityクラスは、次のようになります。

    Opportunity.java

    package com.sample.opty.model.pojos; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Generated; import org.codehaus.jackson.annotate.JsonAnyGetter; import org.codehaus.jackson.annotate.JsonAnySetter; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonPropertyOrder; import org.codehaus.jackson.map.annotate.JsonSerialize; @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) @Generated("org.jsonschema2pojo") @JsonPropertyOrder({ "items", "count", "hasMore", "limit", "offset", "links" }) public class Opportunity {  @JsonProperty("items") private List<Item> items = new ArrayList<Item>();  @JsonProperty("count")    private Integer count;  @JsonProperty("hasMore")    private Boolean hasMore;   @JsonProperty("limit")    private Integer limit;  @JsonProperty("offset")    private Integer offset;  @JsonProperty("links") private List<Link> links = new ArrayList<Link>();  @JsonIgnore private Map<String, Object> additionalProperties = new HashMap<String, Object>(); /** * * @return * The items */  @JsonProperty("items") public List<Item> getItems() { return items; } /** * * @param items * The items */  @JsonProperty("items") public void setItems(List<Item> items) { this.items = items; } /** * * @return * The count */ @JsonProperty("count")    public Integer getCount() { return count; } /** * * @param count * The count */   @JsonProperty("count")    public void setCount(Integer count) { this.count = count; } /** * * @return * The hasMore */  @JsonProperty("hasMore")    public Boolean getHasMore() { return hasMore; } /** * * @param hasMore * The hasMore */  @JsonProperty("hasMore")    public void setHasMore(Boolean hasMore) { this.hasMore = hasMore; } /** * * @return * The limit */ @JsonProperty("limit")    public Integer getLimit() { return limit; } /** * * @param limit * The limit */  @JsonProperty("limit")    public void setLimit(Integer limit) { this.limit = limit; } /** * * @return * The offset */  @JsonProperty("offset")    public Integer getOffset() { return offset; } /** * * @param offset * The offset */ @JsonProperty("offset")    public void setOffset(Integer offset) { this.offset = offset; } /** * * @return * The links */  @JsonProperty("links") public List<Link> getLinks() { return links; } /** * * @param links * The links */ @JsonProperty("links") public void setLinks(List<Link> links) { this.links = links; } @JsonAnyGetter public Map<String, Object> getAdditionalProperties() { return this.additionalProperties; }    @JsonAnySetter    public void setAdditionalProperty(String name, Object value) { this.additionalProperties.put(name, value); } }

    上記のコードには、いくつかのJackson注釈が含まれています。これらの注釈は、JSONオブジェクト・スキーマをJava POJOにマップするために使用されます。Opportunity.javaクラスの上で、RESTリソースのJSONレスポンスからJSONスキーマを定義しました。

    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) @Generated("org.jsonschema2pojo") @JsonPropertyOrder({ "items", "count", "hasMore", "limit", "offset", "links" })

    次に、JSONオブジェクト内のアイテムごとにスキーマ内のプロパティ名をパラメータとして渡して、主要なsetterおよびgetter関数の上に@JsonProperty注釈を追加しました。

  5. Item.javaLink.javaそれぞれに対して新しいPOJO Javaクラスを作成することにより、内部ノードごとに同じプロセスを繰り返すことができます。このコードは、次のようになります。
    Item.java:
    package com.sample.opty.model.pojos; import java.util.HashMap; import java.util.Map; import javax.annotation.Generated; import org.codehaus.jackson.annotate.JsonAnyGetter; import org.codehaus.jackson.annotate.JsonAnySetter; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonPropertyOrder; import org.codehaus.jackson.map.annotate.JsonSerialize; @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) @Generated("org.jsonschema2pojo") @JsonPropertyOrder({ "OptyId", "OptyNumber", "Revenue", "PartyName1", "EmailAddress" }) public class Item {  @JsonProperty("OptyId")    private long optyId;   @JsonProperty("OptyNumber")    private String optyNumber;  @JsonProperty("Revenue")    private long revenue; @JsonProperty("PartyName1")    private String partyName1;  @JsonProperty("EmailAddress")    private String emailAddress; @JsonIgnore private Map<String, Object> additionalProperties = new HashMap<String, Object>(); /** * * @return * The OptyId */   @JsonProperty("OptyId")    public long getOptyId() { return this.optyId; } /** * * @param OptyId * The OptyId */   @JsonProperty("OptyId")    public void setOptyId(long optyId) { this.optyId = optyId; } /** * * @return * The OptyNumber */  @JsonProperty("OptyNumber")    public String getOptyNumber() { return this.optyNumber; } /** * * @param OptyNumber * The OptyNumber */  @JsonProperty("OptyNumber")    public void setOptyNumber(String optyNumber) { this.optyNumber = optyNumber; } /** * * @return * The Revenue */  @JsonProperty("Revenue")    public long getRevenue() { return this.revenue; } /** * * @param Revenue * The Revenue */   @JsonProperty("Revenue")    public void setRevenue(long revenue) { this.revenue = revenue; } /** * * @return * The PartyName1 */    @JsonProperty("PartyName1")    public String getPartyName1() { return this.partyName1; } /** * * @param PartyName1 * The PartyName1 */  @JsonProperty("PartyName1")    public void setPartyName1(String partyName1) { this.partyName1 = partyName1; } /** * * @return * The EmailAddress */  @JsonProperty("EmailAddress")    public String getEmailAddress() { return this.emailAddress; } /** * * @param EmailAddress * The EmailAddress */     @JsonProperty("EmailAddress")    public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; }  @JsonAnyGetter public Map<String, Object> getAdditionalProperties() { return this.additionalProperties; }  @JsonAnySetter    public void setAdditionalProperty(String name, Object value) { this.additionalProperties.put(name, value); } }

    Link.java

    package com.sample.opty.model.pojos; import java.util.HashMap; import java.util.Map; import javax.annotation.Generated; import org.codehaus.jackson.annotate.JsonAnyGetter; import org.codehaus.jackson.annotate.JsonAnySetter; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonPropertyOrder; import org.codehaus.jackson.map.annotate.JsonSerialize; @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) @Generated("org.jsonschema2pojo") @JsonPropertyOrder({ "rel", "href", "name", "kind" }) public class Link { @JsonProperty("rel") private String rel; @JsonProperty("href") private String href; @JsonProperty("name") private String name; @JsonProperty("kind") private String kind; @JsonIgnore private Map<String, Object> additionalProperties = new HashMap<String, Object>(); /** * * @return * The rel */ @JsonProperty("rel") public String getRel() { return rel; } /** * * @param rel * The rel */ @JsonProperty("rel") public void setRel(String rel) { this.rel = rel; } /** * * @return * The href */ @JsonProperty("href") public String getHref() { return href; } /** * * @param href * The href */ @JsonProperty("href") public void setHref(String href) { this.href = href; } /** * * @return * The name */ @JsonProperty("name") public String getName() { return name; } /** * * @param name * The name */ @JsonProperty("name") public void setName(String name) { this.name = name; } /** * * @return * The kind */ @JsonProperty("kind") public String getKind() { return kind; } /** * * @param kind * The kind */ @JsonProperty("kind") public void setKind(String kind) { this.kind = kind; } @JsonAnyGetter public Map<String, Object> getAdditionalProperties() { return this.additionalProperties; } @JsonAnySetter public void setAdditionalProperty(String name, Object value) { this.additionalProperties.put(name, value); } }
次に、Jerseyクライアントを使用して、Oracle Sales Cloud RESTful APIに接続し、これらのPOJOに対するレスポンスからデータをフェッチします。

POJOを使用したADFアプリケーションでのデータ・コントロールの構築

外部アプリケーションでSales Cloudオブジェクトを作成するには、ユーザーからデータを収集するメカニズムを確立する必要があります。リクエスト・ペイロードのソースとして機能するJava Object (POJO)が定義されている場合、Javaオブジェクトからデータ・コントロールを作成してADFページ・ビューを構築できます。データ・コントロールにより、Plain Old Java Object (POJO)からデータの構造が取得されます。

JDeveloperでデータ・コントロールを作成する手順:
  1. POJOクラス・ファイルを右クリックし、「データ・コントロールの作成」をクリックします。
  2. ViewControllerで、jspx (JSF)ページを作成します。
  3. 「データ・コントロール」パネルで、jspxページ上のPOJOデータ・コントロールからデータ・コレクションをADF表としてドラッグ・アンド・ドロップします。

Jerseyクライアント・ライブラリを使用したRESTful Webサービスへのアクセス

JerseyクライアントAPIを使用して、RESTful APIと対話したり、Jacksonを使用してWebサービスからデータをフェッチして既存のPOJOに組み込んだりするためのJavaクラスを作成できます。

JerseyおよびJacksonライブラリを使用してRESTful APIと対話する手順:
  1. 新しいJavaクラスを作成します。
  2. Javaクラス内で、静的create()関数を使用して新しいJerseyClientクライアントを作成します。

    Client c = Client.create();

    SSLを介したBasic認証を使用してRESTfulサービスにアクセスするには、次に示すように、構成オブジェクトをClientに渡します。

            SSLContext sslContext = SSLContext.getDefault();    ClientConfig def = new DefaultClientConfig();        def.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,new HTTPSProperties(null, sslContext)); Client c = Client.create(def); c.addFilter(new HTTPBasicAuthFilter(this.privUserName, this.privUserPwd));

    ClientConfigは構成オブジェクトで、this.privUserNameおよびthis.privUserPwd は、Oracle Sales Cloudの資格証明またはこれらに対するServletContextオブジェクトからの参照です。

    Oracle Sales Cloudにアクセスするための他のセキュリティ・オプションの詳細は、「Oracle Sales Cloud RESTful WebサービスにアクセスするためのRESTセキュリティ・メカニズムの選択」を参照してください。

  3. WebResourceオブジェクトを使用してリソースにアクセスします。たとえば、Oracle Sales Cloud RESTful APIからOpportunityリソースにアクセスするには、URLを指し示してClientオブジェクトのリソースへの参照をWebResourceオブジェクトに渡します。
                    WebResource resource = c.resource("https://>crm_server:PortNumber</salesApi/resources/latest/opportunities/?q=OptyId=300000000845411&fields=Revenue,OptyId,OptyNumber,EmailAddress,PartyName1&onlyData=true");

    次に、WebResourceオブジェクトに対してCRUD操作を起動できます。たとえば、上記のリソースに対して読取り操作を実行し、レスポンスをString変数に保存するには、次を使用します。

                    String response = resource.get(String.class);

    または、次のように、追加のHTTPヘッダーをリクエストに渡すことができます。

                    String response = resource.accept(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_XML_TYPE).header("Accept-Charset", "utf-8").get(String.class);
  4. JacksonのObjectMapperクラスを使用して、WebResourceレスポンスから取得したデータをPOJOクラスに変換します。次に例を示します。
            ObjectMapper jmapper = new ObjectMapper(); jmapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); Opportunity opty = null; try{ opty= jmapper.readValue(response, Opportunity.class);        } catch (JsonParseException e) { } catch (JsonMappingException e) { } catch (IOException e) { } //Test the POJO: //System.out.println(opty.getCount());

    JSONレスポンスが正しい形式でない場合、JsonParseExceptionまたはJsonMappingExceptionがスローされる可能性があります。

これで、サービス・レスポンス・データは、後でJavaアプリケーションで使用できるPOJOオブジェクトに変更されました。

REST操作の例

読取り操作以外にも、リソースの作成、更新および削除などのJerseyクライアントAPIを使用して他のCRUD操作を実行できます。

問合せ文字列パラメータの受渡し

問合せ文字列パラメータを読取り操作に渡すには、MultivaluedMapオブジェクトを使用します。たとえば、下記のコードでは、子リソース19005に対してリクエストを行い、問合せ文字列パラメータとしてonlyData=trueを渡します。

                 WebResource resource = c.resource("https://>crm_server:PortNumber</salesApi/resources/latest/opportunities/"); MultivaluedMap<String, String> params = new MultivaluedMapImpl(); params.add("onlyData","true"); String response = resource.path("19005").queryParams(params).get(String.class);

リソースの作成

作成操作の場合、WebResourcepost()関数を使用して、新しいリソースを作成できます。たとえば、Accountで新しいAddress子リソースを作成するには、次のようにします。

                         WebResource resource = c.resource( "https://>crm_server:PortNumber</crmCommonApi/resources/latest/accounts/{PartyNumber}/child/Address"); String requestPayload = "{\"Address1\":\"A street\",\"City\":\"A City\",\"State\":\"CA\",\"Country\":\"US\"}"; ClientResponse response = resource.accept(MediaType.APPLICATION_JSON_TYPE).entity(requestPayload,"application/vnd.oracle.adf.resourceitem+json").post(ClientResponse.class); //System.out.println(response.getEntity(String.class))                        

{PartyNumber}は、アカウントのプライマリ識別子が含まれる文字列です。Media TypeおよびJSONペイロード・オブジェクトをentityヘッダーに渡す必要があります。この場合、Oracle Sales Cloud RESTful APIは、application/vnd.oracle.adf.resourceitem+jsonをJSONペイロード・オブジェクトのMedia Typeとして受け入れます。

リソースの更新

作成操作で使用したパターンと同じパターンを使用して特定のリソースを更新できますが、この場合、put()関数を使用します。たとえば、SalesTeamMemberリソースを更新するには、次のようにします。

                         WebResource resource = c.resource( "https://>crm_server:PortNumber</crmCommonApi/resources/latest/accounts/{PartyNumber}/child/SalesTeamMember/{TeamMemberId}"); String requestPayload = "{\"TeamMemberId\":000000000000000,\"AccessLevelCode\":\"300\","+ "\"LockAssignmentFlag\":\"true\",\"AssignmentTypeCode\":\"TERRITORY_BASED\","+ "\"ResourceEmailAddress\":\"john.doe@abcxyz.com\"}"; ClientResponse response = resource.accept(MediaType.APPLICATION_JSON_TYPE).entity(requestPayload,"application/vnd.oracle.adf.resourceitem+json").post(ClientResponse.class); //System.out.println(response.getEntity(String.class))                        

リソースの削除

リソースを削除するには、リソースに対して単純にdelete()コールを発行します。

                         WebResource resource = c.resource( "https://>crm_server:PortNumber</crmCommonApi/resources/latest/accounts/{PartyNumber}/child/SalesTeamMember/{TeamMemberId}"); ClientResponse response = resource.delete(ClientResponse.class); //System.out.println(response.getEntity(String.class))                        

エラーの処理

JerseyクライアントAPIを使用して、RESTful Webサービスにアクセスする場合、エラーが発生する可能性があります。Javaアプリケーションがこれらの状況に対処できることが重要です。

Jerseyクライアントを使用したHTTPリクエスト中の実行時にスローされる可能性がある最も一般的な2つのエラーは、ClientHandlerExceptionおよびUniformInterfaceExceptionです。

ClientHandlerExceptionは、レスポンスに読取り/書き込みエラーがあるときにスローされ、これはIOExceptionと似ています。

UniformInterfaceExceptionは、操作が予期されていなかったことをHTTPリクエストのステータス・コードが示しているときにスローされます。この例外がスローされる可能性があるのは、HTTPステータス・コードが300以上であり、レスポンスにエンティティ・ヘッダーが含まれていない場合です。

下記のアプローチを使用すると、RESTful APIから返される様々なHTTPエラー・コードを処理できます。

ClientResponse r = resource.get(ClientResponse.class);  switch(r.getResponseStatus()){ case 400:               //some code case 404:               //some code  ....      }