【问题标题】:php soap client array of strings returns as an empty objectphp soap客户端字符串数组作为空对象返回
【发布时间】:2011-11-02 22:28:58
【问题描述】:

好的,所以我有一个 php soap 客户端,它调用一个方法并正确获取一些信息,它可以抓取简单的类型,如字符串甚至对象,但是当它进入某种类型的数组(在本例中为字符串)时总是作为空对象返回。我尝试将它转换为数组和许多其他东西,但我使用它的每个选项总是返回相同的东西。

以下是一些背景信息:

这是我在 Eclipse 的帮助下在 java 中创建的一个 Web 服务。在用 php 创建客户端之前,我还自动生成了一个 java 客户端来测试 Web 服务。我创建了多个使用自动生成的 java 客户端(代理类)的测试用例,并成功返回了正确的预期值。换句话说,java 毫不费力地抓取了这个字符串数组并向我展示了每个值。我这样做是为了确定问题是服务器端还是客户端,到目前为止它更多地指向客户端。

接下来,php 的soap 客户端有一个不错的功能,如果您将选项设置为include ("trace" => 1),您可以调用__getLastResponse() 来查看响应xml 的样子,所以这里是:

< ?xml version="1.0" encoding="utf-8"?>
< soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    < soapenv:Body>
        < getAllCarClassesIdsAsWsCarClassIdsResponse xmlns="X">
            < getAllCarClassesIdsAsWsCarClassIdsReturn>
                < carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                < /carClassIds>
            < /getAllCarClassesIdsAsWsCarClassIdsReturn>
        < /getAllCarClassesIdsAsWsCarClassIdsResponse>
    < /soapenv:Body>
< /soapenv:Envelope>

请注意,出于安全考虑,某些值已替换为 X。此外,xml 在左括号之后有一个额外的空间,因为我找不到其他方法来发布 xml。如果阅读困难,我深表歉意。

关键是响应显示了正确的值(那些 X 应该在字符串数组中),但我仍然看到一个空白对象。下面是完整响应对象的 var_dump:

object(WsCarClassIds)#4 (1) {
   ["carClassIds"]=>
  object(stdClass)#5 (0) {
  }
}

下面是对对象使用 get_object_vars() 后的 var_dump:

array(1) {
  ["carClassIds"]=>
  object(stdClass)#5 (0) {
  }
}

下面是对象的 var_dump,然后是使用 (array) $carClassIds 将其转换为数组的 var_dump:

object(stdClass)#5 (0) {
}
array(0) {
}

如果信息有帮助,这里有一些 wsdl 文件,其中包含应该是字符串数组的“复杂类型”:

< complexType name="ArrayOf_xsd_string">
    < sequence>
     < element maxOccurs="unbounded" minOccurs="0" name="item" type="xsd:string"/>
    < /sequence>
   < /complexType>

另外,我想补充一点,在实例化肥皂客户端时,我已经尝试在选项数组中添加“SOAP_USE_XSI_ARRAY_TYPE”功能。这是许多论坛上处理“ArrayOf_xsd_string”反序列化的建议。添加选项无效。

我还尝试将其添加到我的代码顶部: ini_set('soap.wsdl_cache_enabled', 0); 这告诉客户端禁用 wsdl 缓存,这也导致没有任何变化。

我在这里提供了很多信息,但我愿意提供解决此问题可能需要的任何其他信息。我已经为此工作了将近 2 天,很长的时间,似乎找不到解决方案。任何帮助将不胜感激,谢谢。

-阿萨夫

【问题讨论】:

    标签: java php web-services wsdl client


    【解决方案1】:

    所以我能够找到解决问题的方法。看,我使用的是 eclipse 的默认 web 服务轴类,旧版本。我没有使用显然更新的 Axis 2。他们将 java 代码转换为 WSDL 文件的方式不同,这并不奇怪。

    升级到使用 Axis 2 制作 Web 服务后,php 客户端能够正确读取数组。可能 php 客户端期待一个新格式的 wsdl 文件,但不知道如何解释旧格式。

    这是我最后一次让另一个程序员说服我按照他设置的方式使用系统,而不是升级到最新版本(因为他很懒,他的话,不是我的)。

    -阿萨夫

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2017-03-09
      相关资源
      最近更新 更多