gpt4 book ai didi

php - SOAP 错误 : Encoding: Violation of encoding rules?

转载 作者:可可西里 更新时间:2023-10-31 22:19:03 26 4
gpt4 key购买 nike

伙计们,我被困住了,在过去的几个小时里,我的头一直在敲 table 。

我正在尝试使用一项服务,我调用了其他 8 个函数,它们在本质上与这个函数几乎相同,但是这个函数会导致“SOAP-ERROR: Encoding: Violation of encoding rules”错误.

这是函数调用(为了安全省略了 wsdl):

    function CanLoadProduct($data){

$client = new SoapClient('wsdl-url');

$params = array('username' => $this->username,
'password' => $this->password,
'prod' => $data['productid'],
'mdn' => $data['mdn']);

try {
$reply = $client->__soapCall("CanLoadProduct", $params);
} catch (Exception $e) {
echo 'Error: ', $e->getMessage(), "\n";
print_r($params);
die();
}

if( $reply['result'] == 1 ){
return TRUE; // 1 = true
} else {
return FALSE;
}

}

好的,这个函数连接到一个网络服务,所需的元素是:用户名、密码、prod、mdn,所有这 4 个都是我作为 $params 数组的一部分提供的。用户名/密码是较早定义的,并且工作正常,因为其他 8 个函数使用 Web 服务没有任何问题。

$data[] 数组(我传递给函数)包含:$data['productid']$数据['mdn']没有使用其他任何东西。

我得到了

SOAP-ERROR: Encoding: Violation of encoding rules

出于某种无法解释的原因,谷歌搜索这个错误让我无处可去。还有其他人遇到这个吗?运行 PHP 5.2.9-2。奇怪的是这与 100% 有效的函数相同:

    function GetPIN($productid){

$client = new SoapClient('wsdl-url');

$params = array('username' => $this->username,
'password' => $this->password,
'prod' => $productid);

try {
$reply = $client->__soapCall("GetPIN", $params);
} catch (Exception $e) {
echo 'Error: ', $e->getMessage(), "\n";
die();
}
return $reply;
}

这是 WSDL(应该先发布):

<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="ready:test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="ready:test">
<types>
<xsd:schema targetNamespace="ready:test"
>
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
</xsd:schema>
</types>
<message name="CanLoadProductRequest">
<part name="username" type="xsd:string" />
<part name="password" type="xsd:string" />
<part name="prod" type="xsd:string" />
<part name="mdn" type="xsd:string" />
<part name="esn" type="xsd:string" /></message>
<message name="CanLoadProductResponse">
<part name="result" type="xsd:int" /></message>
<portType name="CanLoadProductPortType">
<operation name="CanLoadProduct">
<input message="tns:CanLoadProductRequest"/>
<output message="tns:CanLoadProductResponse"/>
</operation>
</portType>

<binding name="CanLoadProductBinding" type="tns:CanLoadProductPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="CanLoadProduct">
<soap:operation soapAction="{url-removed}" style="rpc"/>
<input>
<soap:body use="encoded" namespace=""
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace=""
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="CanLoadProduct">
<port name="CanLoadProductPort" binding="tns:CanLoadProductBinding">

<soap:address location="{url-removed}"/>
</port>
</service>
</definitions>

最佳答案

看起来你在某个地方有类型不匹配,要么是在组装你的请求时(其中一个参数不是字符串类型),要么是服务器返回了 int 以外的东西(违反了 WSDL 响应定义,从而导致客户端认为响应无效,因为它期望其他东西)。

  • 要测试第一种情况,请确保首先将所有参数转换为字符串
  • 要测试第二种情况,创建您的 SoapClient 并将 trace 选项设置为 true,以便随后通过 $client->__getLastResponse() 从服务器访问实际的 XML 应答(您也可以通过 __getLastRequest() 将其用于请求调试。

一些额外的观察/问题:

  • 根据发布的 WSDL,“CanLoadProductRequest”有第五个参数“esn”,您没有在函数调用中提供它。
  • 您使用 $client->__soapCall("CanLoadProduct", $params) 的任何原因而不是 $client->CanLoadProduct($username, $password, etc.) ? (第一个版本是一个较低级别的变体,旨在用于非 WSDL 场景。第二个版本可能会为您提供更详细的错误/异常)
  • 您能否通过其他方式测试对 CanLoadProductRequest 的 SOAP 调用?错误可能在服务器端,试图返回不符合 WSDL 定义的结果类型。

关于php - SOAP 错误 : Encoding: Violation of encoding rules?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1309477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com