ウェブサービスを構築するときの便利プロトコル、SOAP。
XML通信をベースとしたシステムで、下位の転送プロトコルに一般的なHTTPの他、SMTPなどを用いることも出来る便利プロトコル。
PHPでもPHP-SOAPモジュールを使うことで扱うことが出来る。
WSDL(Web Services Description Language:ウェブサービス記述言語)によって、サーバとクライアントでウェブサービスの機能や通信形式を記述することが出来て、これを記述すればリモートのサービスをあまり意識することなく処理することが出来る。
<?xml version=”1.0″ encoding=”UTF-8″?>
<wsdl:definitions
name=”MyService”
targetNamespace =”http://xn--ockc3f5a.com/”
xmlns =”http://schemas.xmlsoap.org/wsdl/”
xmlns:apachesoap =”http://xml.apache.org/xml-soap”
xmlns:wsdlsoap =”http://schemas.xmlsoap.org/wsdl/soap/”
xmlns:soapenc =”http://schemas.xmlsoap.org/soap/encoding/”
xmlns:soapenv =”http://schemas.xmlsoap.org/soap/envelope/”
xmlns:xsd =”http://www.w3.org/2001/XMLSchema”
xmlns:xsi =”http://www.w3.org/2001/XMLSchema-instance”
xmlns:wsdl =”http://schemas.xmlsoap.org/wsdl/”><wsdl:message name=”getSumRequest”>
<wsdl:part name=”A” type=”xsd:decimal”/>
<wsdl:part name=”B” type=”xsd:decimal”/>
</wsdl:message><wsdl:message name=”getSumResponse”>
<wsdl:part name=”Answer” type=”xsd:decimal”/>
</wsdl:message><wsdl:portType name=”Sum”>
<wsdl:operation name=”getSum”>
<wsdl:input name=”getSumRequest” message=”getSumRequest”/>
<wsdl:output name=”getSumResponse” message=”getSumResponse”/>
</wsdl:operation>
</wsdl:portType><wsdl:binding name=”SumSoapBinding” type=”Estates”>
<wsdlsoap:binding style=”rpc” transport=”http://schemas.xmlsoap.org/soap/http”/>
<wsdl:operation name=”getSum”>
<wsdlsoap:operation soapAction=””/>
<wsdl:input name=”getSumRequest”>
<wsdlsoap:body use=”encoded” encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/” namespace=”http://xn--ockc3f5a.com/”/>
</wsdl:input>
<wsdl:output name=”getSumResponse”>
<wsdlsoap:body encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/” namespace=”http://xn--ockc3f5a.com/”/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding><wsdl:service name=”MyService”>
<wsdl:port name=”Estate” binding=”SumSoapBinding”>
<wsdlsoap:address location=”http://xn--ockc3f5a.com/service”/>
</wsdl:port>
</wsdl:service></wsdl:definitions>
こんなXML文書がWDSL定義。
で、serviceに
function getSum($A, $B) {
return $A+$B;
}$server = new SoapServer(“service?wsdl”);
$server->addFunction(‘getSum’);
$server->handle();
みたいな実装をすると、SOAPクライアントからgetSum(A, B)を呼び出すとA+Bの結果が返ってくる。
クライアントは
$options = array(
‘soap_version’=>SOAP_1_2,
‘exceptions’=>true,
‘trace’=>1,
‘cache_wsdl’=>WSDL_CACHE_NONE
);$client = new SoapClient(‘http://xn--ockc3f5a.com/service?wsdl’, $options);
echo(“$_GET[‘A’] + $_GET[‘B’] = “.$client->getSum($_GET[‘A’], $_GET[‘B’]));
これで、client.php?A=1&B=2とかフォームで投げれば
1 + 2 = 3
みたいな動作をしてくれる。
細かい通信動作とかを自分で作らないでも、勝手に処理してくれる便利ものだ。 通信の実装を一切書かず、ローカル命令を使うのと大差ない記述でリモート命令を使えるので、ビジネスロジックとプレゼンテーションを分離したシステムを構築したりするのにとても便利だ。
SOAPはJavaや.NETにも実装されているから、サーバやクライアントを別言語で実装することも出来て自由度も高い(クライアントに至ってはMicrosoftのInfoPathと言うOfficeスイートのアプリを使うと、GUI操作だけで簡単にフォーム型クライアントを構築できてしまう)
今回は基本機能だけ使ったが、サーバで発生した例外をクライアントでキャッチしたり、addFunctionで関数を割り当てるのに変えてクラスを割り当てたり、独自の型をTypesで定義して使うことが出来るので、色々と追加していくと、超便利である。
(762)