[OSB] Enhanced REST Support in Oracle Service Bus 11gR1

RESTとOracle Service Busに関する過去のエントリで、相対URLの一部としてRESクエリ文字列を実際にエンコードしました。たとえば、次のようなURIを考えます。
http://localhost:7001/SimpleREST/Products/id=1234 
このアプローチは技術的に問題ありませんが、一般的には検索パラメータをクエリ文字列にエンコードします。次のURLではこの原則に則っています。
>http://localhost:7001/SimpleREST/Products?id=1234
一見些細な違いのように見えますが、このアプローチはより直感的で、特に複数のパラメータを渡す場合には有効です。たとえば、
http://localhost:7001/SimpleREST/Products?cat=electronics&subcat=television&mfg=sony
上のURIはSonyで作られたテレビの一覧を取得するために使われていることが明らかです。前バージョンのOSB(11gR1 PS3より前)では、URIのクエリ文字列処理が難しかったのですが、最新リリースの11gR1 PS3ではクエリ文字列の処理が簡単になったので、OSBでRESTサービスを開発することも以前より簡単になりました。このエントリでは、過去のエントリで作成した、パラメータ情報を渡すためのクエリ文字列を使ったRESTful Productsサービスを再実装していきます。

まずは、Products RESTサービスの実装を始めましょう。このサービスはプロジェクト中のProducts.proxyファイルで実装されています。以下のスクリーンショットのようなサービスの全体構成で始まります。

これはOracle Service BusにおけるRESTサービスの共通パターンです。サービスがサポートしておくべきHTTPの操作ごとに異なるフローを実装します。GETをどのように実装するかみてみましょう。これはブラウザに入れるべきPathです。
http://localhost:7001/SimpleREST/Products/id=1234
リクエストパイプラインに割り当てアクションがあり、そこでクエリパラメータを取り出しています。 idパラメータを抽出するために使われている式は以下のようです。
$inbound/ctx:transport/ctx:request/http:query-parameters/http:parameter[@name="id"]/@value
割り当てアクションでOSBの変数idに値を格納します。この手のXPath式を使うと、任意の変数を変数名でクエリすることができます。このときパラメータリストの順序を考える必要はありません。

ログアクションは単にOSBコンソールにデバッグ情報を表示するためです。レスポンスパイプラインには交換アクションがあり、RESTサービスの応答ドキュメントを作成しています。ほとんどの応答データは静的ですが、返り値のIDフィールドにはRESTプロキシへ渡されたクエリパラメータの結果を設定します。
ブラウザでRESTサービスをテストするのはとても簡単で、先ほど示したURLを入れるだけですが、ブラウザは本当に簡単なGETサービスのテストにしか利用できません。OSBテストコンソールは任意のHTTPの操作でも使えるずっと堅牢なテスト環境です。テストコンソールを使ってこのGETサービスをテストするところを見てみましょう。

OSBコンソール (http://{ホスト名 or IP}:{ポート番号}/sbconsole) を開き、管理者としてログインします。SimpleRESTプロジェクトのProductsプロキシサービスのテストコンソールのアイコン(小さな虫のアイコン)をクリックすると、テストコンソールウィンドウが立ち上がります。SOAPサービスとは異なり、リクエスト情報のすべてがサービスのURIにエンコードされるので、リクエストドキュメントの設定は不要です。テストコンソールの[リクエストドキュメント]の下はトランスポートセクションです。このセクションを拡大し、クエリパラメータやHTTPメソッドフィールドを以下のスクリーンショットのように編集しましょう。
 
デフォルトでは、クエリパラメータのフィールドには定義済みのタグが入っていますので、サービスに渡したいパラメータのタグを追加すればOKです。この特別な呼び出しのために、以下のようなクエリパラメータを設定します。
<tp:query-parameters xmlns:tp="http://www.bea.com/wli/sb/transports/http">
<tp:parameter name="id" value="1234" />
</tp:query-parameters>
これで実行ボタンを押す準備ができました。ボタンを押せば結果が確認できます。

ここまでで、OSBを使用してクエリパラメータを解析するための手順をカバーしていますが、もしRESTfulサービスを利用するOSBプロキシサービスが存在する場合はどうすればよいでしょうか。OSBにクエリパラメータを外部サービスに通知するように指示するにはどうすればよいでしょうか。
このサンプルコードには2番目のプロキシサービス(CallREST)を用意しています。これは任意のRESTサービスを呼び出すのと全く同じ方法で、Productsプロキシサービスを呼び出します。CallRESTプロキシサービスはSOAPサービスとして定義しており、これにより、OSBのサービスコンシューマとサービスプロバイダ間を取り持ち、両者の結合レベルを弱める機能(疎結合性)をデモすることができます。 
CallRESTプロキシサービスのメッセージフローを検証するには、Operationalブランチを使って、SOAPサービスとして定義されている各オペレーションの処理ロジックを分けます。getProductDetailブランチに着目すると、これはProducts RESTサービスをHTTP GETで呼び出しています。getProductパイプラインとステージノードを開きます。SOAPリクエストからproductIDを取り出し、ローカルOSB変数にproductIDを格納する一つの割り当てアクションがあります。特に驚くようなことはありません。
実際の処理はパイプライン以下のルートノードでやっています。第一に覚えておくべきことは、RESTサービスを呼び出す際には、サービスコールアウトやパブリッシュアクションではなく、ルートノードを使う必要があるということです。特にビジネスサービスを呼び出すときには、ルーティングアクションだけが$outbound変数にアクセスできるというのがその理由です。

ルーティングアクションには3個の挿入アクションがあります。第1の挿入アクションではHTTPの操作をGETとして指定する方法を示しています。
 
 第2の挿入アクションは単にXMLノードをリクエストにインサートします。このエレメントはデフォルトではリクエストメッセージ中に存在しませんので、手動で追加する必要があります。

アウトバウンドリクエストにエレメントを定義したので、RESTサービスに送信したいパラメータでエレメントを埋めることができます。次のスクリーンショットでは、SOAPリクエストドキュメントから抽出しておいたproductIDの値をidパラメータに指定する方法がわかります。

この式ではidという名前を持つパラメータを探し、その値を取り出します。
これで終了です。Oracle Service Bus 11gR1PS3のクエリパラメータを解析する能力を最大限に活用する方法についてご理解いただけたかと思います。
サンプルコードはこちらです。 rest2_sbconfig.jar

Ubuntu and the OSB Test Console
Ubuntuやその他のLinux Distribution上でOSBテストコンソールを使おうとするとエラーが起きる可能性があります。このエラーはテストコンソールサービスが起動していないことを示しています(下図)。

この問題の解決するのは簡単で、WebLogic Serverの管理コンソールを開き(通常はhttp://localhost:7001/console)、左のドメイン構造のペインで[環境]の下の[サーバー]を選択します。

コンソールのメインウィンドウで管理サーバを選択します。デフォルトでは[構成]の[一般]タブの内容が表示されているはずです。[リスニング・アドレス]を探すと、デフォルトでは空白になっています。これは任意のインターフェースを受け付けるという意味ですが、Ubuntuではこの設定を嫌うため、空白の代わりにlocalhostもしくは特定のIPアドレス、DNSで解決できるホスト名(開発環境では通常localhostを使います)を指定、変更を保存してサーバを再起動してください。これにより、テストコンソールは正常に動作するはずです。

参考URL
RESTful Services with Oracle Service Bus(過去のエントリ)
http://blogs.oracle.com/jeffdavies/2009/06/restful_services_with_oracle_s_1.html


原文はこちら。
http://blogs.oracle.com/jeffdavies/2011/02/enhanced_rest_support_in_oracl.html

0 件のコメント:

コメントを投稿