SOAP-ERROR:编码:违反编码规则?

时间:2011-04-12 16:57:49

标签: php soap wsdl yii

我正在尝试使用Yii来提供Web服务。自动生成的wsdl如下所示。我可以从命令行成功使用Web服务,但是通过Web浏览器,我得到了

SOAP-ERROR: Encoding: Violation of encoding rules

我是SOAP新手,所以我不确定如何调试问题。这是我用来使用Web服务的PHP代码:

<?php
    $client=new SoapClient('{url omitted for security}',
        array('trace'=>1,'exceptions'=>1));
    try {
        $result = $client->getPerson(90043412);
        var_dump($result);
    } catch (SoapFault $fault) {
        echo $fault->getMessage() . '<br />';
        echo 'REQUEST <br />';
        echo '<pre>';
        echo $client->__getLastRequestHeaders();
        echo $client->__getLastRequest();
        echo '</pre>';
        echo 'RESPONSE <br />';
        echo '<pre>';
        echo $client->__getLastResponseHeaders();
        echo $client->__getLastResponse();
        echo '</pre>';
        echo 'TRACE <br />';
        echo '<pre>';
        var_dump($fault->getTrace());
        echo '</pre>';
    }
?>

这是WSDL:

<?xml version="1.0" encoding="UTF-8"?> 
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:PersonControllerwsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" name="PersonController" targetNamespace="urn:PersonControllerwsdl">
    <wsdl:types>
        <xsd:schema targetNamespace="urn:PersonControllerwsdl">
            <xsd:complexType name="Person">
                <xsd:all>
                    <xsd:element name="PIDM" type="xsd:integer"/>
                    <xsd:element name="FirstName" type="xsd:string"/>
                    <xsd:element name="MiddleName" type="xsd:string"/>
                    <xsd:element name="LastName" type="xsd:string"/>
                    <xsd:element name="PrefFirstName" type="xsd:string"/>
                    <xsd:element name="CPOBox" type="xsd:string"/>
                    <xsd:element name="Classification" type="xsd:string"/>
                    <xsd:element name="Email" type="xsd:string"/>
                    <xsd:element name="PhotoFile" type="xsd:string"/>
                </xsd:all>
            </xsd:complexType>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="getPersonRequest">
        <wsdl:part name="PIDM" type="xsd:int"/>
    </wsdl:message>
    <wsdl:message name="getPersonResponse">
        <wsdl:part name="return" type="tns:Person"/>
    </wsdl:message>
    <wsdl:portType name="PersonControllerPortType">
        <wsdl:operation name="getPerson">
            <wsdl:documentation></wsdl:documentation>
            <wsdl:input message="tns:getPersonRequest"/>
            <wsdl:output message="tns:getPersonResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="PersonControllerBinding" type="tns:PersonControllerPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="getPerson">
            <soap:operation soapAction="urn:PersonControllerwsdl#getPerson" style="rpc"/>
            <wsdl:input>
                <soap:body use="encoded" namespace="urn:PersonControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="encoded" namespace="urn:PersonControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="PersonControllerService">
        <wsdl:port name="PersonControllerPort" binding="tns:PersonControllerBinding">
            <soap:address location="https://localhost/whoswho/person/service?ws=1"/>
        </wsdl:port>
    </wsdl:service>
</definitions> 

4 个答案:

答案 0 :(得分:4)

SOAP请求可能格式不正确。我一直在使用SoapUI,默认情况下所有参数都设置为'?'最初,如果您发出此请求,PHP将失败并回复您报告的错误消息。你无法捕捉到这一点,因为没有抛出异常,这是因为它是一个致命的错误。

您可以使用set_error_handler()函数http://php.net/manual/en/function.set-error-handler.php

为此情况设置自己的错误处理程序

答案 1 :(得分:2)

我正在努力将我的PHP版本更新为5.6.26,并在我的Web服务调用上弹出此错误。过了一会儿,我发现这个问题可以修改PHP.ini文件中的这一行:

;always_populate_raw_post_data = -1

查看文档时,此版本中不推荐使用此选项。

我希望这个评论可以节省时间。

答案 2 :(得分:1)

如果我在与托管Web服务的服务器不同的服务器上托管使用脚本,则它可以正常运行。由于Web服务是为机器通信而设计的,而不是机器通信,这似乎是一个适当的解决方案。

答案 3 :(得分:1)

我知道这是一个旧帖子,但是如果你碰到它时我试图找出这个问题,你可以尝试将soap:地址设置为http://127.0.0.1而不是http://localhost。我遇到过其他一些有帮助的论坛。