SOAP-ERROR:编码:是否违反编码规则? [英] SOAP-ERROR: Encoding: Violation of encoding rules?

查看:120
本文介绍了SOAP-ERROR:编码:是否违反编码规则?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

伙计们,我被困住了,在过去的几个小时中,我的头从桌子上摔下来.

Guys, I'm stuck, banging my head off the desk for the past few hours.

我正在尝试使用一种服务,我还有其他8个函数,这些函数本质上与该函数几乎相同,但是此函数会导致"SOAP错误:编码:违反编码规则"错误

I am trying to consume a service, and I have 8 other functions that I call that are almost IDENTICAL in nature to this one, but this one, results in a 'SOAP-ERROR: Encoding: Violation of encoding rules' error.

此处调用函数(为安全起见,省略了wsdl):

Heres the function call (wsdl omitted for security):

    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;
    }

}

好的,因此此功能连接到Web服务,所需元素为: 用户名,密码,prod,mdn,所有这四个我都作为$ params数组的一部分提供.用户名/密码是较早定义的,并且可以正常工作,因为其他8个功能可以正常使用Web服务.

Ok so this function, connects to a webservice, the required elements are: username, password, prod, mdn, all 4 of which I supply as part of the $params array. Username/Pass are defined earlier, and do work fine, as the other 8 functions consume the web service without any problems.

$ data []数组(我传递给该函数)包含: $ data ['productid'] $ data ['mdn'] 什么也没用.

The $data[] array (that I pass to the function), contains: $data['productid'] $data['mdn'] nothing else is used.

我得到

SOAP-ERROR: Encoding: Violation of encoding rules

由于某些无法解释的原因,Google搜索此错误使我无处可去.还有其他人遇到吗?运行PHP 5.2.9-2.奇怪的是,这与100%有效的功能相同:

for some unexplained reason, and Googling this error gets me nowhere. Anyone else run into this? Running PHP 5.2.9-2. The strange thing is this is identical to this function which works 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(应该先发布):

Here is the WSDL (should have posted this first):

<?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响应定义,并因此导致客户端认为响应无效,因为它期望其他内容).

It looks like you have a type mismatch somewhere, either while assembling your request (one of the parameters is not of type string), or the server returns something other than an int (violating the WSDL response definition and thus causing the client to consider the response invalid, as it expects something else).

  • 要测试第一种情况,请确保首先将所有参数强制转换为字符串
  • 要测试第二种情况,请在 trace 选项设置为true的情况下创建SoapClient,以便随后通过$ client-> __ getLastResponse()从服务器访问实际的XML答案(您可以也可以通过__getLastRequest())将其用于请求调试.
  • To test the first case, ensure casting all parameters to string first
  • To test the second case, create your SoapClient with the trace option set to true in order to gain access to the actual XML answer from the server via $client->__getLastResponse() afterwards (You can use this for request debugging also via __getLastRequest()).

一些其他的观察/问题:

Some additional observations/questions:

  • 根据发布的WSDL,"CanLoadProductRequest"具有第五个参数"esn",您在函数调用中未提供该参数.
  • 为什么使用$client->__soapCall("CanLoadProduct", $params)代替$client->CanLoadProduct($username, $password, etc.)? (第一个版本是较低级别的版本,旨在用于非_WSDL场景.第二个版本可能会为您提供更详细的错误/异常信息)
  • 可以通过其他方法测试对CanLoadProductRequest的SOAP调用吗?该错误可能在服务器端,试图返回不符合WSDL定义的结果类型.
  • According to the posted WSDL, the 'CanLoadProductRequest' has a fifth param 'esn', which you do not supply in your function call.
  • Any reason why you use $client->__soapCall("CanLoadProduct", $params) instead of $client->CanLoadProduct($username, $password, etc.)? (The first version is a lower level variation which is intended to be used for non_WSDL scenarios. The second version might give you a more detailed error/exception)
  • Can you test the SOAP Call to CanLoadProductRequest by some other means? The error could be on the server side, trying to return a result type that does not fit the WSDL definition.

这篇关于SOAP-ERROR:编码:是否违反编码规则?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆