我正在尝试使用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>
答案 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。我遇到过其他一些有帮助的论坛。