2011-11-02 84 views
0

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

下面是一些背景资料:

这是我使用eclipse的帮助下用Java创建Web服务。我还自动生成了一个Java客户端,以在使用php创建客户端之前测试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它的var_dump铸造到一个数组使用(阵列)$ carClassIds:

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”功能实例化SOAP客户端时。这是许多论坛处理“ArrayOf_xsd_string”失序问题的建议。添加选项没有效果。我试过把这个添加到我的代码顶部: ini_set('soap.wsdl_cache_enabled',0); 它告诉客户端禁用wsdl缓存,这也导致没有变化。

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

-Asaf

回答

0

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

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

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

-Asaf