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 にバインドするために、ホスト ファイルを編集しまし た。私のブラウザ:

<?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_reporting を有効にしE_STRICTたりE_NOTICE、より有益なエラー ヒントを取得したりすることもできます。

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

また、soapUIを使用すると、より拡張可能なテストを実行できます。

于 2012-10-15T08:29:37.163 に答える