2013-04-13 59 views
1

我想用php/soap使用WSDL web服务。它总是给出一个反序列化错误,它正是:PHP/SOAP不创建所需的XML请求

反序列化操作'Test'的请求消息体的错误。 OperationFormatter遇到无效的消息体。预期会找到名称为'Test'和命名空间''的节点类型'Element'。找到名为'parameters'和'namespace'的节点类型'Element'

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

当我比较由SOAP创建的请求XML和由WcfTestClient软件创建的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); 
} 
+0

您的PHP代码丢失。此外,WSDL URI缺失。每个元素都有一个*不同的*名称,这导致了一些根本错误的假设。就像不在您的SOAP客户端中使用WSDL一样? –

+0

编辑添加PHP代码。我不能提供确切的服务网址,对不起。我使用了肥皂1,因为肥皂2给出的内容类型错误是'无法处理消息,因为内容类型'application/soap + xml;字符集= UTF-8; action =“urn:VWService/Test”'不是预期的类型'text/xml; charset = utf-8' – Erdi

+0

这个XML仍然丢失:'http://url.to/web/service.svc?wsdl'(WSDL文档) –

回答

0

我找不到确切的原因和解决方案,但这似乎是工作。

首先,当您为wsdl方法提供对象而不是数组时,您可以摆脱item,value节点。节点将根据对象名称

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

被创建之后,我实现的<参数>节点的代替< WsdlMethod>在XML请求创建的节点。重写__doRequest方法并替换字符串,可以摆脱这个问题,但仍不能看到响应。需要通过str_replace将< wsdlMethodResponse>节点与<参数>结合起来,最后得到期望的响应。

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