我想用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 当我在浏览器中访问“http://csi.chemicalseeker.com/csiService.php?WSDL”时,WSDL运行良好:
<?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-&gt; getFunctions()”和“$ client-&gt; 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信封中。 我错过了重要的事情或者在我的代码中犯了一些错误吗?如果你有线索,请帮帮我。谢谢!
答案 0 :(得分:3)
我也在努力解决这个问题,但我设法通过切换到非WSDL模式解决了上面遇到的问题。
无论我尝试什么,在尝试从我自己的自动发现生成的WSDL加载WSDL时,我总是收到相同的空响应。 (感觉可能存在一些递归问题,但我现在看不清楚)
无论如何,切换到非WSDL模式给了我适当的响应。
尝试按如下方式创建服务器:
$server = new Zend_Soap_Server(null, array('uri' => $WSDL_URI));
答案 1 :(得分:0)
在进行测试时查看php错误日志。
您还可以启用error_reporting E_STRICT
或E_NOTICE
以获取更多信息性错误提示:
http://php.net/manual/de/function.error-reporting.php
使用soapUI,您可以进行更多可扩展的测试: