我正在尝试使用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);
}
答案 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,最后获得所需的响应。
正如我所说,这可能是一个临时解决方案。但为我工作:)