SOAP: Передать массив значений с одинаковым тегом

Denis_Sokolov

Новичок
Здравствуйте. Не могу понять каким образом возможно передать массив значений, что бы в xml запросе он был с одинаковым тегом. Возможно непонятно изъясняюсь, приведу пример:

wsdl сгенерирован с помощью nuSOAP, вот выдержка кода который принимает данные:
PHP:
$server->wsdl->addComplexType( 
    'ArrayOfId', 
    'complexType', 
    'array', 
    'all', 
    '', 
   array( 
        'id' => array('name' => 'id', 'type' => 'xsd:int')
    )
); 
$server->wsdl->addComplexType( 
    'GetStatusQuery', 
    'complexType', 
    'struct', 
    'all', 
    '', 
    array( 
        'password' => array('name' => 'password', 'minOccurs' => 1, 'maxOccurs' => 1, 'type' => 'xsd:string'),
        'id_array' => array('name' => 'id_array', 'minOccurs' => 1, 'type' => 'tns:ArrayOfId'),
        'type' => array('name' => 'type', 'minOccurs' => 0, 'maxOccurs' => 1, 'type' => 'xsd:boolean')
    ) 
);
$server->register('GetStatus', 
    array('get_status_query' => 'tns:GetStatusQuery'),  
    array('get_status_response' => 'tns:GetStatusResponse'), 
    'urn:SmsService',    
    'urn:SmsService#GetStatus',   
    'rpc',     
    'encoded'     
    
);
Генерится соответствующий кусок wsdl:
PHP:
<xsd:complexType name="ArrayOfId">
   <xsd:all>
      <xsd:element name="id" type="xsd:int"/>
   </xsd:all>
</xsd:complexType>

<xsd:complexType name="GetStatusQuery">
   <xsd:all>
      <xsd:element name="password" type="xsd:string" minOccurs="1" maxOccurs="1"/>
      <xsd:element name="id_array" type="tns:ArrayOfId" minOccurs="1"/>
      <xsd:element name="type" type="xsd:boolean" minOccurs="0" maxOccurs="1"/>
   </xsd:all>
</xsd:complexType>
Отправляю с помощью soapUI следующие данные:
PHP:
   <password>mypass</password>
   <id_array xsi:type="urn:ArrayOfId" xs:type="type:ArrayOfId">
      <id>22</id>
      <id>23</id>
      <id>24</id>
   </id_array>
Все работает замечательно, и в функции получаемые id доступны:
PHP:
$response['id_array']['id'][0] // 22
$response['id_array']['id'][1] // 23
$response['id_array']['id'][2] // 24
А вот теперь главный вопрос. Отправка из soapUI это конечно же хорошо, но нужно это использовать из php. Отправляю данные следующим образом:
PHP:
$client->GetStatus(array('password'=>'mypass', 'id_array'=>array('id'=>array(22, 23, 24))));
А в результате облом. Посмотрел __getLastRequest() и увидел там:
PHP:
<password xsi:type="xsd:string">mypass</password>
<id_array xsi:type="ns1:ArrayOfId">
   <id xsi:type="xsd:int">1</id>
</id_array>
То есть преобразовало массив в integer. Каким образом я могу корректно передать массив множества значений id? Пробовал указывать в wsdl int[] Но тогда soapUI ругается, и говорит что это неправильно...из php работать будет, но SOAP же не для того придумали что бы ограничиваться запросами из php :) Прошу помощи знатоков. Благодарю за внимание.

UPD: Гуглил ровно неделю. Есть только одна подобная тема, где в решении написано: "Проблема решена, wsdl был с ошибкой" И все...
 

WMix

герр M:)ller
Партнер клуба
я не увидел тип array в твоем wsdl
PHP:
   <xsd:all>
      <xsd:element name="id" type="xsd:int"/>
   </xsd:all>
значит "безымянный/любой" обьект с аттрибутом id типа int
array обычно пишется так
PHP:
 <xsd:sequence>
  ...
</xsd:sequence>
погляди тут
http://stackoverflow.com/questions/14877724/php-wsdl-nusoap-complextype-array-of-itself или тут
http://www.discorganized.com/php/a-complete-nusoap-and-flex-example-part-1-the-nusoap-server/

я не юзал nusoap но в обоих примерах наблюдаю 'SOAP-ENC:Array'
 
Последнее редактирование:
Сверху