1

PHP で独自の PHP Soap Service にアクセスしようとすると問題が発生します。クライアントとサーバーの両方に Zend_Soap を使用しています。

基本的に、クライアントから取得した結果は null です。しかし、最後の応答を見ると、期待どおりの正しい XML が含まれています。そのため、クライアントは xml を php オブジェクト (私のテスト ケースでは単純な int) に変換して使用することに失敗しています。

私のwsdlは次のようになります

<definitions name="SOAP_Model_soaphandler" targetNamespace="http://website.com/appldev/applications/public/SOAP/index/soap">
    <types>
        <xsd:schema targetNamespace="http://website.com/appldev/applications/public/SOAP/index/soap"/>
    </types>
    <portType name="SOAP_Model_soaphandlerPort">
        <operation name="test">
            <documentation>Returns list of all products in database</documentation>
            <input message="tns:testIn"/>
            <output message="tns:testOut"/>
        </operation>
        <operation name="test2">
            <documentation>Adds new product to database</documentation>
            <input message="tns:test2In"/>
            <output message="tns:test2Out"/>
        </operation>
    </portType>
    <binding name="SOAP_Model_soaphandlerBinding" type="tns:SOAP_Model_soaphandlerPort">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="test">
            <soap:operation soapAction="http://website.com/appldev/applications/public/SOAP/index/soap#test"/>
            <input>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://website.com/appldev/applications/public/SOAP/index/soap"/>
            </input>
            <output>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://website.com/appldev/applications/public/SOAP/index/soap"/>
            </output>
        </operation>
        <operation name="test2">
            <soap:operation soapAction="http://website.com/appldev/applications/public/SOAP/index/soap#test2"/>
            <input>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://website.com/appldev/applications/public/SOAP/index/soap"/>
            </input>
            <output>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://website.com/appldev/applications/public/SOAP/index/soap"/>
            </output>
        </operation>
    </binding>
    <service name="SOAP_Model_soaphandlerService">
        <port name="SOAP_Model_soaphandlerPort" binding="tns:SOAP_Model_soaphandlerBinding">
            <soap:address location="http://website.com/appldev/applications/public/SOAP/index/soap"/>
        </port>
    </service>
    <message name="testIn"/>
    <message name="testOut">
        <part name="return" type="xsd:int"/>
    </message>
    <message name="test2In">
        <part name="id" type="xsd:int"/>
    </message>
    <message name="test2Out">
        <part name="return" type="soap-enc:Array"/>
    </message>
</definitions>

私の応答は次のようになります

<env:envelope xmlns:enc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://website.com/appldev/applications/public/SOAP/index/soap" xmlns:env="http://www.w3.org/2003/05/soap-envelope">
    <env:body xmlns:rpc="http://www.w3.org/2003/05/soap-rpc">
        <ns1:testresponse env:encodingstyle="http://www.w3.org/2003/05/soap-encoding">
            <rpc:result>return</rpc:result>
            <return xsi:type="xsd:int">7</return>
        </ns1:testresponse>
    </env:body>
</env:envelope>

しかし

$result=$client->test(); 
var_dump($result);

NULL を出力します。

何か案は?私にはうまくいくはずですが、私は石鹸クライアントがどのように機能するかについての専門家ではありません。おそらく名前空間か何かに問題がありますか?私は本当に知りません。それはうまくいくはずです。参考までに、このガイドに従って作業を開始しました。

http://www.ibm.com/developerworks/webservices/library/x-zsoap/index.html

私はいつでも xml から手動で応答を取得できると思いますが、クライアントがそうしない理由を理解したいと思っています。

4

2 に答える 2

2

石鹸の一時ファイルを削除してから/tmp/wsdl*、Webサーバーを再起動してください。この助けを願っています。

于 2012-12-02T17:00:13.150 に答える
-1

ちょっと遅くなりましたが、念のためサービスクラスのメソッドの宣言を確認すると、コメントはこんな感じになるはずです

/** * サービス * * @param タイプ $varname * @return タイプ */

/** と 1 つのスペースと残りのスペースが必要です。それ以外の場合は null が返されます。

幸運を!

于 2013-09-23T00:08:41.757 に答える