PHP / SOAP不会创建所需的xml请求

时间:2013-04-13 07:59:50

标签: php xml soap wsdl

我正在尝试使用php / soap的WSDL Web服务。并且它总是给出一个反序列化错误,正好是:

  

反序列化操作'Test'的请求消息正文时出错。 OperationFormatter遇到无效的Message正文。期望找到名称为“Test”和名称空间“'的节点类型”Element“。找到名为'parameters'和'namespace'的节点类型'Element'

当我使用WcfTestClient软件测试WSDL源时,没有任何问题,它会返回所需的结果。

当我比较由WcfTestClient软件创建的SOAP和XML创建的请求XML时,我发现差异可能是问题所在。它似乎与命名空间和前缀有关,但我不知道如何解决它,或者它可能是导致问题的原因。

请求XML是:http://pastebin.com/eysnG89F

如果您需要PHP代码,this is the code I am using

try{
        $soap_options = array(
            'soap_version' => SOAP_1_1,
            'cache_wsdl'   => WSDL_CACHE_NONE,
            'trace' => TRUE
        );
        $soap = new SoapClient(
            'http://url.to/web/service.svc?wsdl', $soap_options
        );
        $a = $soap->Test(
           array("login" => 
               array(
                   "FirmaId"      => 15, 
                   "KullaniciAdi" => "Asdf", 
                   "Parola"       => "Xyxy",
               )
           )
         );
        var_dump($a);
} catch (Exception $e) {
        var_dump($e);
}

1 个答案:

答案 0 :(得分:0)

我无法找到确切的原因和解决方案,但这似乎有效。

首先,当你为wsdl方法赋予对象而不是数组时,你可以摆脱item,value节点。节点将按对象名称

创建
$a = $soap->Test(
       (object)array("login" => 
           (object)array(
               "FirmaId"      => 15, 
               "KullaniciAdi" => "Asdf", 
               "Parola"       => "Xyxy",
           )
       )
     );

之后我意识到<参数>节点而不是< WsdlMethod>在请求xml中创建的节点。通过重写__doRequest方法并替换字符串,可以摆脱这个问题,但仍然无法看到响应。需要包装< wsdlMethodResponse>节点与<参数>通过str_replace,最后获得所需的响应。

正如我所说,这可能是一个临时解决方案。但为我工作:)