使用php从Web服务构建获得空响应

时间:2012-09-04 18:29:54

标签: php web-services zend-framework soap

我想用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信封中。 我错过了重要的事情或者在我的代码中犯了一些错误吗?如果你有线索,请帮帮我。谢谢!

2 个答案:

答案 0 :(得分:3)

我也在努力解决这个问题,但我设法通过切换到非WSDL模式解决了上面遇到的问题。

无论我尝试什么,在尝试从我自己的自动发现生成的WSDL加载WSDL时,我总是收到相同的空响应。 (感觉可能存在一些递归问题,但我现在看不清楚)

无论如何,切换到非WSDL模式给了我适当的响应。

尝试按如下方式创建服务器:

$server = new Zend_Soap_Server(null, array('uri' => $WSDL_URI));

答案 1 :(得分:0)

在进行测试时查看php错误日志。

您还可以启用error_reporting E_STRICTE_NOTICE以获取更多信息性错误提示:

http://php.net/manual/de/function.error-reporting.php

使用soapUI,您可以进行更多可扩展的测试: