SOAP起動のフロー
任意のSOAPクライアントからメソッドを適切な引数をつけて呼び出すと、フローが起動されます。フローでは構造体ではない単純なデータ型を引数、返り値としてやりとりするRPCスタイルと、任意のXMLをやりとりするRPC/DocumentスタイルのSOAPをサポートしています。
HTTPSリスナーで通信を行う場合、管理コンソールで登録された証明書を使用してPKI基盤に従ってクライアントと通信を行います。
フロー
SOAP起動のフローは、次の2つの形式のいずれかでなければなりません。
- StartコンポーネントでParameterListを出力し、ParameterListを返すEndResponseコンポーネントで終了する
- StartコンポーネントでXMLを出力し、XMLを返すEndResponseコンポーネントで終了する
入力、出力ストリーム型をParameterListとするフローでは単純なデータ型をメソッドの引数/返り値としてやりとりするRPCスタイルのSOAPのみ作成できます。この場合、Startコンポーネントで定義したParameterListがメソッドの引数となり、EndResponseコンポーネントの入力ストリームであるParameterListがメソッドの返り値となります。
入出力をXMLとするフローではXMLの文書要素の下に自由にフィールド定義を行い、それをやりとりすることができます。Startコンポーネントで定義するXMLの文書要素はSOAPのメソッド名となり、EndResponseに差し込まれたXMLの文書要素はSOAPメソッドの返り値のラッパー要素(慣例的には「メソッド名+"Response"」という要素名)となります。
※入出力をParameterListとする形式は単純なRPCを作成する場合の簡易形式であり、入出力をXMLとしても同じ処理内容のフローを作成することができます。
いずれの形式の場合でもエラーを返す場合はSOAPFaultコンポーネントを使ってSOAPFaultで返すことができます。
フローを作成する
SOAPで実行するフローを作成するためには上記条件を満たすフローを手作業で作成することもできますが、ウィザードを使用することでいくつかの手順を簡略化することができます。
- フローの作成ダイアログボックスで、「カテゴリー」ドロップダウンリストから「トリガー起動」を選択し表示される「SOAP」テンプレートをクリックします。
- 作成するSOAPフローのTargetNamespaceとオペレーション名(メソッド名)を入力します。
- 完了をクリックすると「Start > Mapper > SubFlow > Mapper > EndResponse」という構成のフローが作成されます。
ウィザードで作成されたフローには以下の項目があらかじめ設定されています。
- Startコンポーネントの出力ストリーム定義がXMLであり、その文書要素にSOAPのオペレーション名が設定されている
- EndResponseコンポーネント直前のマッパー出力ストリーム定義がXMLであり、その文書要素に「SOAPのオペレーション名 + "Response"」が設定されている
- 実際の処理を実行するためのサブフローコンポーネントがStartとEndResponseの間に配置されている
この雛型に対し以下の作業を行うことでSOAPフローを完成させます。
- Startコンポーネントの文書要素以下にオペレーションの引数となるフィールド定義を行う。
- EndResponseコンポーネント直前のマッパーの文書要素以下にオペレーションの返り値となるフィールド定義を行う
- 実際に処理を行うサブフローを設定し、SOAPの入出力に対してマッピングを行う
実際には処理は必ずしもサブフローとして作成する必要はありませんが、この形式を守ることによりテスト(デザイナーからの実行)などがやりやすくなります。
開始(入力ストリーム)
入出力をParameterListとする場合、フローの入力ストリームにはSOAPオペレーションの引数を設定します。
入出力をXMLとする場合、フローの入力ストリームはクライアントから送信されるリクエストメッセージのSOAPBody直下の最初の要素(TargetNamespaceを名前空間とし、オペレーション名を要素名とする要素)になります。その文書要素以下にクライアントが送信するリクエストメッセージの内容をフィールド定義します。
フローのパラメーター
フローのパラメーターはありません。
終了(出力ストリーム)
入出力をParameterListとする場合、フローの出力ストリームにはSOAPオペレーションの返り値を設定します。
入出力をXMLとする場合、フローの出力ストリームはサーバーがクライアントに返すレスポンスメッセージのSOAPBody直下の最初の要素になります。その文書要素以下にサーバーが送信するレスポンスメッセージの内容をフィールド定義します。
※SOAPBody直下に複数の要素があるようなSOAPメッセージは作成できません。
実行設定
SOAP実行設定では以下の項目を設定します。実行設定を行うことによってSOAP1.1、WSDL1.1に準拠したSOAPサービスが指定のエンドポイントから実行可能になります。
TargetNamespace |
SOAPメッセージのTargetNamespaceを指定します。
TargetNamespaceとは複数のSOAPオペレーションをまとめるための名称ととらえてください。 トリガー管理のWSDL出力ではTargetNamespaceごとに一つのファイルが作成されます。 入出力をXMLで定義する場合はTargetNamespaceと入力ストリーム文書要素のネームスペースは同じでなければなりません。 |
---|---|
Operation | SOAPメッセージのオペレーション名を指定します。 OperationとはSOAPメッセージを識別するための名前です。 入出力をXMLで定義する場合はOperationと入力ストリーム文書要素の要素名は同じでなければなりません。 |
Style | SOAPメッセージのスタイルを指定します。 |
Use | SOAPメッセージのエンコード方式を指定します。 StyleがDocumentの場合はUseは「literal」固定になります。 |
Endpoint |
実行に使用するURLのEndpointを指定します。 Endpointを指定しない場合のSOAP実行のURLは以下のようになります。 http://<サーバーアドレス>:<ポート>/soapEndpointを指定した場合は以下のようになります。 http://<サーバーアドレス>:<ポート>/soap/<Endpoint> |
実行設定を定義する
フローデザイナーの実行設定ダイアログボックス、またはトリガー管理のツールバーの「SOAP」をクリックします。「処理フローの設定」グループの「フロー」右にある「選択」ボタンからフローを選択します。フローの入出力ストリームがXMLの場合はTargetNamespaceとOperationはStartコンポーネントで定義しているXMLの文書要素から自動的に設定されます。
StyleとUse
SOAPにはRPCスタイルとDocumentスタイルがありますが、それぞれのスタイルでやり取りされる電文(SOAPEnvelope)を見てもほとんど違いはありません。また、SOAP起動のフローの作り方はどちらのスタイルの場合でも同じになります。
以下にRPCとDocumentの違いについて説明します。
RPC
RPCとは「Remote Procedure Call」の略です。直訳するとリモートにあるプロシージャの実行、つまり異なるホスト上にあるプログラムメソッドを実行してその返り値を取得することを指します。
RPCを実現するための手段にはSOAP以外にも多数の方法があるのですが、SOAPの場合は大まかに言うと以下のようなルールで実現しています。
- SOAPBodyの直下にメソッド名を表す要素を置く
- メソッド名の下にはメソッドの引数(または返り値)を任意のXML形式でおく
例えば
function int add(int a, int b)
のような単純な足し算をRPCで表現する場合、そのリクエスト定義は以下のようになります。
<ns1:add xmlns:ns1="urn:test"> <a>5</a> <b>10</b> </ns1:add>
ここでは足し算を行う二つの引数をそれぞれ「a」「b」という要素名で表していますが、この「a」「b」という要素名にはJavaのようなプログラミング言語でメソッドを定義する際に引数に名前を付ける程度の意味しかありません。つまり、RPCにおいては実行する処理のパラメーターをやりとりするために便宜的にXMLを用いていますが、そのXML自体には意味はありません。
Document
一方のDocumentスタイルではXML文書そのものをやりとりします。つまりそこでやりとりされるXMLの各要素には意味があります。広く世間で使用されているXMLのスキーマや社内で規定したスキーマを使用する場合にはDocumentスタイルを用います。
literalとencoded
SOAPのUse(エンコード方式)には「encoded」と「literal」がありますが、「encoded」はSOAPの初期、XML Schemaの仕様が勧告になる前に制定されたエンコード方式です。現在では「literal」方式のみですべての内容が表現可能であることからWS-I BasicProfileによって「encoded」は使うべきではないと定められています。「encoded」方式は過去のバージョンとの互換性のため残されていますが、特別な理由がある場合以外は使用しないようにしてください。
※WS-I Basic Profileとは異なるベンダーによって作成されたSOAPシステム同士の接続性を向上させるためにSOAP仕様とは別にSOAPサービスの実装者が 守るべきルールを定めたプロファイルです。
SOAP実行を行うフロー作成のためのガイドライン
SOAPから実行するフローを作成する際には以下の点を考慮してください。
- メソッド呼び出しのみでXML自体に意味がない場合はRPCスタイルにする
- やりとりするXMLに意味がある場合はDocumentスタイルにする
- RPCの場合は文書要素以外では名前空間を使わない(意味がないし慣例的にも使用されない)
- 文書要素以下で使用する名前空間はTargetNamespaceと異なっていても良い
- RPCであっても同じ名前の要素を異なる定義で使用してはならない
(あるメソッドでは要素aの下にb,c,dという子要素があるが、別のメソッドではaの下にd,e,fがあるという状況では正しいWSDLが生成できない) - 同じTargetNamespaceでRPCとDocumentを混在させない