PHP と Zend フレームワークを使用して Web サービスを作成したいと考えていました。サーバー側のコードは次のとおりです。
csiService.php:
<?php
require_once 'Zend/Loader.php';
require_once 'CSI.php';
$WSDL_URI="http://csi.chemicalseeker.com/csiService.php?WSDL";
if(isset($_GET["WSDL"]))
{
Zend_Loader::loadClass('Zend_Soap_AutoDiscover');
Zend_Loader::loadClass('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence');
$autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence');
$autodiscover->setBindingStyle(array('style' => 'document'));
$autodiscover->setOperationBodyStyle(array('use' => 'literal'));
$autodiscover->setClass('CSI');
$autodiscover->handle();
}
else
{
Zend_Loader::loadClass('Zend_Soap_Server');
$server = new Zend_Soap_Server($WSDL_URI);
$server->setClass('CSI');
$server->handle();
}
?>
これにはCSI.phpが含まれます:
<?php
class CSI {
/**
* @return string
*/
function helloWorld()
{
return("Hello");
}
}
?>
*ドメイン「csi.chemicalseeker.com」を 127.0.0.1 にバインドするために、ホスト ファイルを編集しまし た。私のブラウザ:
<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://csi.chemicalseeker.com/csiService.php" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="CSI"
targetNamespace="http://csi.chemicalseeker.com/csiService.php">
<types>
<xsd:schema targetNamespace="http://csi.chemicalseeker.com/csiService.php">
<xsd:element name="helloWorld">
<xsd:complexType />
</xsd:element>
<xsd:element name="helloWorldResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="helloWorldResult" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</types>
<portType name="CSIPort">
<operation name="helloWorld">
<documentation>@return string</documentation>
<input message="tns:helloWorldIn" />
<output message="tns:helloWorldOut" />
</operation>
</portType>
<binding name="CSIBinding" type="tns:CSIPort">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="helloWorld">
<soap:operation
soapAction="http://csi.chemicalseeker.com/csiService.php#helloWorld" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<service name="CSIService">
<port name="CSIPort" binding="tns:CSIBinding">
<soap:address location="http://csi.chemicalseeker.com/csiService.php" />
</port>
</service>
<message name="helloWorldIn">
<part name="parameters" element="tns:helloWorld" />
</message>
<message name="helloWorldOut">
<part name="parameters" element="tns:helloWorldResponse" />
</message>
</definitions>
また、CSIClient.php という名前の php クライアント ファイルを作成し、ブラウザーからアクセスしました。
CSIClient.php
<?php
require_once 'Zend/Loader.php';
require_once 'CSI.php';
Zend_Loader::loadClass('Zend_Soap_Client');
$WSDL_URI="http://csi.chemicalseeker.com/csiService.php?WSDL";
$client = new Zend_Soap_Client($WSDL_URI);
echo('<pre>');
var_dump($client->helloWorld());
echo('</pre>');
?>
結果は「Hello」の内容を含む文字列であると予想されますが、空の stdObject が表示されます。
object(stdClass)#3 (0) {
}
「$client->getFunctions()」と「$client->getTypes()」を介して関数リストと型リストを取得できます。これは、「CSI」クラスが Web サービスに正常に接続されたことを意味します。しかし、結果が正しく返ってきません。
Web サービスを呼び出す他の方法も試しました。Flash Builder を使用して helloWorld() 関数を呼び出すと、サーバーからの応答は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://csi.chemicalseeker.com/csiService.php">
<SOAP-ENV:Body>
<ns1:helloWorldResponse/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
ご覧のとおり、期待される結果「Hello」も SOAP エンベロープに含まれていません。重要なことを見逃していたり、コードで間違いを犯したりしていませんか? 手がかりがあれば教えてください。ありがとうございました!