PHP soap客户端字符串数组作为空对象返回


php soap client array of strings returns as an empty object

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

下面是一些背景信息:

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

接下来,php的soap客户端有一个很好的特性,如果您将选项设置为包含("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客户机时,我已经尝试在选项数组中添加"SOAP_USE_XSI_ARRAY_TYPE"特性。这是许多论坛上处理"ArrayOf_xsd_string"的反序列化的建议。添加选项没有效果。

我还试着把这个添加到我的代码的顶部:报错("肥皂。wsdl_cache_enabled ', 0);它告诉客户端禁用wsdl缓存,这也导致没有更改。

我在这里写了很多信息,但我愿意写任何其他可能需要解决这个问题的信息。我已经花了将近整整2天的时间来解决这个问题,但似乎还是找不到解决方案。如有任何帮助,我将不胜感激,谢谢。

-Asaf

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

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

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

-Asaf