试图通过PHP将数据发布到SOAP方法


Trying to post a data to a SOAP method via PHP

我有一个基于SOAP协议的web服务。SOAP提供了一个Add方法,它接受一个OO对象变量作为输入。

我正在尝试向他们的服务添加数据。这是代码:

// this classes create a structure for WSSE security headers 
class clsWSSEAuth
{
  private $Username;
  private $Password; 
  function __construct($u, $p)
  {
    $this->Username = $u; 
    $this->Password = $p;
  }
}
class clsWSSEToken
{
  private $UsernameToken;
  function __construct($i)
  {
    $this->UsernameToken=$i; 
  }
}    
$params = array('trace' => true);
$user = 'xxxxxx'; 
$pass = base64_encode(sha1('yyyyy', true));  //sha1 is sth like mdf - it codes the pass 
$wssens = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';  //namespace
$soapVarUser = new SoapVar ($user, XSD_STRING, NULL, $wssens, NULL, $wssens);
$soapVarPass = new SoapVar ($pass, XSD_STRING, NULL, $wssens, NULL, $wssens);
//PREPARATION OF VARIABLE FO USER AND PASS - END
//Create Object for Auth Class and pass in soap var 
$wsseAuth = new clsWSSEAuth ($soapVarUser, $soapVarPass); 
//Create SoapVar out of object of Auth class 
$soapVarAuth = new SoapVar ($wsseAuth, SOAP_ENC_OBJECT, NULL, $wssens, 'UsernameToken', $wssens);
//Create object for Token Class 
$wsseToken = new clsWSSEToken ($soapVarAuth);
//Create SoapVar out of object of Token class 
$soapVarToken = new SoapVar ($wsseToken, SOAP_ENC_OBJECT, NULL, $wssens, 'UsernameToken', $wssens);
//Create SoapVar for 'Security' node 
$soapHeader = new SoapVar ($soapVarToken, SOAP_ENC_OBJECT, NULL, $wssens, 'Security', $wssens);
//Create header object out of security soapvar 
$header = new SoapHeader($wssens, 'Security', $soapHeader, true, 'htpp://abce.com'); 
//Create object of Soap Client
$client = new SoapClient('https://xxxxxx.support.xxxxxxx.pl:8443/webservices/LAB/LabResultsManagerEP?wsdl', $params);
//Set headers for soapclient object 
$client->__setSoapHeaders($header); 
//definition of example object
class CreateOrderResultListVO {
  public $ord;
  function CreateOrderResultListVO(){
//and some other stuff here too
    $this -> ord = $any_structure_of_objects_maching_required_fields;
  }
}
$test = new CreateOrderResultListVO(); //this is preety much any php OO object
try 
{  
  $id=$client->add($test -> ord);
} catch (Exception $e) { echo "error in add method: <pre>"; var_dump($e);echo "</pre>"; }
用Java编写了

客户端,运行正常。c#中的客户端也是如此。但据我所知,我是第一个尝试在PHP中这么做的人。

实际上,传递给Add方法的对象的结构很复杂(它匹配的不是那么小的xml文件),但显然这不是问题所在。

我得到在var_dump错误:整个对象结构+ this:

  ["faultstring"]=>
  string(23) "VO object can't be null"
  ["faultcode"]=>
  string(10) "env:Server"
  ["detail"]=>
  object(stdClass)#19 (1) {
    ["ErlabException"]=>
    object(stdClass)#20 (2) {
      ["code"]=>
      string(10) "WRONG_DATA"
      ["message"]=>
      string(23) "VO object can't be null"
    }
  }

这意味着(我认为)soap连接是可以的(我在get_data方法中有相同的一个并且工作正常),但出于某种原因,方法添加不做任何与我发送的日期,就像它没有看到它?

我真的很感激任何帮助。我该如何处理这个问题,或者至少我该如何寻找问题所在?

编辑:我希望这个帮助:我已经安装了小提琴,以听取什么是从我的电脑发送到互联网。我已经配置了firefox来处理它。我得到的只是浏览器中显示的php网页的内容。c#和java客户端只显示SOAP Add方法生成的xml。我几乎可以肯定,php连接与SOap webservice只是很好(除非错误我得到的不是SOap添加错误,但SOap服务器错误),所以我不明白为什么小提琴手显示什么。

没人知道?:)好了,就是这样,用this代替标准的函数调用:

  $args = array('soap_parameter_name' => $xml_objects);
  $id = $client->__soapCall('add', array('parameters' => $args));