3

我想用 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 WSDL 工作得很好,因为我访问了“http://csi.chemicalseeker.com/csiService.php?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->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 信封中。我是否错过了一些重要的事情或在我的代码中犯了一些错误?如果你有线索,请帮助我。谢谢!

4

2 回答 2

3

我也在为此苦苦挣扎,但我设法通过切换到非 WSDL 模式来解决您在上面遇到的问题。

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

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

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

$server = new Zend_Soap_Server(null, array('uri' => $WSDL_URI));
于 2013-08-21T02:36:31.087 回答
0

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

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

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

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

于 2012-10-15T08:29:37.163 回答