【发布时间】: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