1

我正在尝试将 WSDL Web 服务与 php/soap 一起使用。而且它总是给出一个反序列化错误,这正是:

反序列化操作“测试”的请求消息正文时出错。OperationFormatter 遇到无效的消息正文。预计会找到名称为“Test”和命名空间“”的节点类型“Element”。找到名称为“参数”和“命名空间”的节点类型“元素”

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

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

请求 XML 是这样的:http: //pastebin.com/eysnG89F

如果您需要 PHP 代码,这是我正在使用的代码

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

1 回答 1

0

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

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

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

之后,我实现了一个 <parameters> 节点,而不是在请求 xml 中创建的 <WsdlMethod> 节点。通过覆盖 __doRequest 方法并替换字符串,可以摆脱这个问题但仍然看不到响应。需要通过 str_replace 用 <parameter> 包裹 <wsdlMethodResponse> 节点,最终得到想要的响应。

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

于 2013-04-15T12:37:51.537 回答