SCA for PHP は、@service アノテーションの後に @binding.soap アノテーションを含むコンポーネントについての WSDL を作成します。WSDL を作成するために、SCA はコンポーネントの情報を取得し、各 public メソッドの @param アノテーションおよび @return アノテーションの内容を調べます。 また、コンポーネント内の @types アノテーションの内容も調べます。 @param アノテーションおよび @return アノテーションからの情報を基にして、 WSDL の <types> セクションを構築します。また、@types アノテーションによる別のスキーマファイルの指定は、WSDL 内の <import> 要素に変換されます。
WSDL の最後は <service> 要素で、 この要素の location 属性によってサービスの URL を表します。 たとえば、次のようになります。
例1 location 属性
<service name="ConvertedStockQuote" ... location="http://localhost/ConvertedStockQuote/ConvertedStockQuote.php"/>
この location は、ウェブサーバーのドキュメントルートからの相対位置であることに注意しましょう。 事前に解決することはできません。コンポーネントがウェブサーバー上の適切な場所に配置され、 ホスト名やポート番号がわかった時点ではじめて解決することができます。 WSDL を要求した URL からの情報を使用します。つまり、たとえば http://www.example.com:1111/ConvertedStockQuote/ConvertedStockQuote.php?wsdl へのリクエストの応答として WSDL が作成されたとすると、 WSDL の location 属性には http://www.example.com:1111/ConvertedStockQuote/ConvertedStockQuote.php が挿入されます。
SCA for PHP が作成する WSDL は、ドキュメント/リテラル でラップした形式となります。これは、パラメータを囲い込んで 'ラッパー' メソッド型として返すものです。この型は、 対応するメソッドの名前となります。WSDL の先頭にある <types> 要素で、これらのラッパーを定義します。 ConvertedStockQuote のサンプルにおける getQuote() メソッドを考えてみましょう。
例2 ふたつの引数を持つメソッド
<?php
/**
* ティッカーシンボルと通貨を指定して、株価を取得する
*
* @param string $ticker ティッカーシンボル。
* @param string $currency 値を変換する通貨単位。
* @return float 指定した通貨単位で表した株価。
*/
function getQuote($ticker, $currency)
{
$quote = $this->stock_quote->getQuote($ticker);
$rate = $this->exchange_rate->getRate($currency);
return $rate * $quote;
}
?>
このメソッドの WSDL は、メソッドとパラメータの名前を定義します。 また、パラメータに対応する XML スキーマ型を提供します。 WSDL の types セクションは、このようになります。
例3 パラメータ名を表す types セクション
<types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ConvertedStockQuote"> <xs:element name="getQuote"> <xs:complexType> <xs:sequence> <xs:element name="ticker" type="xs:string"/> <xs:element name="currency" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getQuoteResponse"> <xs:complexType> <xs:sequence> <xs:element name="getQuoteReturn" type="xs:float"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </types>
インターフェイス内で順番に指定したパラメータと soap リクエスト内の名前つきパラメータを含む XML を相互変換するために、 SCA ランタイムは特別な処理をします。この件について知るために、 さまざまなインターフェイスを使用する PHP スクリプトが SOAP コールようのパラメータリストをどのように作成するのかを考えてみましょう。 たとえば PHP の SoapClient を使用する PHP スクリプトは、 "ticker" および "currency" の値を指定したひとつのパラメータを SoapClient に渡す必要があります。おそらくこれは連想配列になるでしょう。 SCA コンポーネントがウェブサービス用にパラメータリストを作成する場合は、 相手がローカルであるかリモートであるかによって形式が異なります。 そのため、個別のアプローチが必要となります。
SCA が SCA コンポーネント用の WSDL を作成する際に、 その WSDL が SCA コンポーネントのインターフェイスであることを示すコメントを埋め込みます。 ある SCA コンポーネントが別のコンポーネントをウェブサービスとしてコールするとき、 呼び出し側の SCA ランタイムが受け取るパラメータは、 指定された順番に並べられたリストとなります。 これを、soap メッセージの名前つきパラメータにひとつひとつ割り当てるわけです。 たとえば、上で定義した getQuote() メソッドに値 'IBM' および 'USD' を渡す場合のコール方法は、このようになります。
<?php
$quote = $remote_service->getQuote('IBM','USD');
?>
この結果は、次のような soap メッセージになります。
<getQuote> <ticker>IBM</ticker> <currency>USD</currency> </getQuote>
サービス提供側の SCA コンポーネントは、soap メッセージから受け取った 名前つきパラメータをひとつひとつ受け取り、順番が指定されたパラメータリスト形式の ('IBM','USD') に再変換します。
どちらの側の SCA ランタイムについても、 soap メッセージ内でのパラメータの登場順が メソッドのパラメータリストの順序と一致していることを前提としています。 これは、@param アノテーションの順序によって決まります。 これが、WSDL 内でのパラメータの登場順と soap メッセージ内でのパラメータの登場順を定義しています。 したがって、@param アノテーションの順序は メソッドのパラメータの順番と一致させておくことが必要不可欠です。