PHP的SoapClient类型映射表现不同

5
我有一个Web服务函数,它将一个项目数组返回给PHP客户端。根据项目数量,PHP返回类型不同。如果该函数返回一个项目,则PHP类型为stdClass;如果该函数返回多个项目,则PHP类型为array。无论哪种情况,都应该是array。我该怎么做才能实现这一点?
细节如下:从Web服务函数的结果进行var_dump的输出如下:
  • 如果结果中只有一个项目:
    array(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> object(stdClass)#38 (9) ...
  • 如果结果中有多个项目:
    array(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> array(16) ...
函数名为getFilter,WSDL文件的相关部分如下:
<types>
  <schema ...>
    <complexType name="arrayFilter">
      <sequence>
        <element name="item" type="ns1:stFilter" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
      </sequence>
    </complexType>
    ...
  </schema>
</types>

<message name="getFilterResponse">
  <part name="filterErg" type="ns1:arrayFilter"/>
  <part name="functionResult" type="xsd:int"/>
  <part name="outErr" type="xsd:string"/>
</message>

<portType name="ADServicePortType">    
  <operation name="getFilter">
    <documentation>Service definition of function ns1__getFilter</documentation>
    <input message="tns:getFilter"/>
    <output message="tns:getFilterResponse"/>
  </operation>
  ...
</portType>

<binding name="ADService" type="tns:ADServicePortType">
  <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <operation name="getFilter">
    <SOAP:operation style="rpc" soapAction=""/>
    <input>
      <SOAP:body use="encoded" namespace="urn:ADService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    </input>
    <output>
      <SOAP:body use="encoded" namespace="urn:ADService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    </output>
  </operation>
  ...
</binding>
2个回答

8
您可以在创建SoapClient时使用SOAP_SINGLE_ELEMENT_ARRAYS选项。
$soapConfig = array(
    'soap_version' => SOAP_1_2,
    'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
    'trace'    => true
);
$client = new SoapClient('http://localhost:8070/Services.wsdl', $soapConfig);

2

有时候需要将变量从对象更改为包含该对象的数组:

if (is_object($variable))
{
    $variable = array($variable);
}

更具体地说,针对您的情况:
if (is_object($result["filterErg"]->item))
{
    $result["filterErg"]->item = array($result["filterErg"]->item);
}

简单实用的解决方案,非常感谢!我之前没想到,一直专注于修改 Web 服务接口。 - Christian Ammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接