Возвращение массива строк из PHP SoapServer - PullRequest
1 голос
/ 18 ноября 2011

Я пытаюсь построить мыльный сервис на PHP. WSDL, который я использую для веб-сервиса, был автоматически сгенерирован Visual Studio 2010 (я только использовал Visual Studio для создания WSDL, реальный сервер строится на PHP с SoapServer). Запросы к службе мыла обрабатываются, но когда я пытаюсь вернуть массив строк, клиент не возвращает никаких результатов. Вот соответствующие разделы WSDL:

<s:element name="getGroups">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="code" type="s:string" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:element name="getGroupsResponse">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="getGroupsResult" type="tns:ArrayOfString" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="ArrayOfString">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string" />
    </s:sequence>
  </s:complexType>
  .
  .
  <wsdl:message name="getGroupsSoapIn">
     <wsdl:part name="parameters" element="tns:getGroups" />
  </wsdl:message>
  <wsdl:message name="getGroupsSoapOut">
     <wsdl:part name="parameters" element="tns:getGroupsResponse" />
  </wsdl:message>
  .
  .
  <wsdl:operation name="getGroups">
      <wsdl:input message="tns:getGroupsSoapIn" />
      <wsdl:output message="tns:getGroupsSoapOut" />
  </wsdl:operation>

Код PHP-сервера выглядит следующим образом:

function getGroups($args)
{
    return array('ArrayOfString' => array('hello world'));
}

$server = new SoapServer( 'admin.wsdl' );
$server->addFunction('getGroups');
try {
    $server->handle();
}
catch (Exception $e) {
    $server->fault('Sender', $e->getMessage());
}

Я также пытался возвратить массив ('hello world') из функции PHP getGroups , но это также не сработало. Может кто-нибудь, пожалуйста, помогите мне исправить PHP-код для возврата массива строк, который будет соответствовать моему определению WSDL.

1 Ответ

1 голос
/ 30 ноября 2011

он работает с таким типом complexType:

<s:complexType name="ArrayOfString2">
   <complexContent>
      <restriction base="SOAP-ENC:Array">
         <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="string[]"/>
      </restriction>
   </complexContent>
</s:complexType>
.
.
<wsdl:message name="getGroupsSoapOut">
  <wsdl:part name="parameters" type="tns:ArrayOfString2" />
</wsdl:message>

внутри server.php иногда очень важно добавить строку:

ini_set("soap.wsdl_cache_enabled", "0");

, иначе результаты могут быть непредсказуемыми.

...