44 JavaアプリケーションからのRESTfulサービスへのアクセスおよびRESTペイロードの管理
一般的な概要
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メソッド(GET
、PUT
、DELETE
、POST
または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から作成する必要があります。
Oracle Sales Cloud SSL RESTful WebサービスにアクセスするためのJDeveloperキーストアの構成
ローカル開発環境内のOracle Sales CloudリモートSSL RESTful Webサービスにアクセスするには、RESTful SSLサービス証明書を使用してJDeveloperを構成する必要があります。このタスクでは、Oracle Sales Cloud SSL証明書をJDeveloperキーストアに追加します。
JavaプロジェクトへのJerseyライブラリの追加
Jerseyは、JAX-RS 1.1の参照実装です。これは、単純な注釈の使用を介してJava EEでRESTアーキテクチャ・スタイルを昇格する一連のAPIを定義する、オープン・ソース・プロジェクトです。
JavaプロジェクトへのJacksonライブラリの追加
Jacksonライブラリは、注釈を使用してJSONオブジェクトをJava POJOクラスに変換するために使用できる、高パフォーマンスのJSON処理ライブラリです。
JSONを使用してRESTレスポンスを処理するためのPOJOの構築
Jacksonライブラリを使用して、RESTful APIリソースのJSONスキーマに基づいてPOJOを構築できます。
POJOを使用したADFアプリケーションでのデータ・コントロールの構築
外部アプリケーションでSales Cloudオブジェクトを作成するには、ユーザーからデータを収集するメカニズムを確立する必要があります。リクエスト・ペイロードのソースとして機能するJava Object (POJO)が定義されている場合、Javaオブジェクトからデータ・コントロールを作成してADFページ・ビューを構築できます。データ・コントロールにより、Plain Old Java Object (POJO)からデータの構造が取得されます。
- POJOクラス・ファイルを右クリックし、「データ・コントロールの作成」をクリックします。
- ViewControllerで、jspx (JSF)ページを作成します。
- 「データ・コントロール」パネルで、jspxページ上のPOJOデータ・コントロールからデータ・コレクションをADF表としてドラッグ・アンド・ドロップします。
Jerseyクライアント・ライブラリを使用したRESTful Webサービスへのアクセス
JerseyクライアントAPIを使用して、RESTful APIと対話したり、Jacksonを使用してWebサービスからデータをフェッチして既存のPOJOに組み込んだりするためのJavaクラスを作成できます。
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);
リソースの作成
作成操作の場合、WebResource
のpost()
関数を使用して、新しいリソースを作成できます。たとえば、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 .... }