PHP SOAP Request: необходим массив с ключами - PullRequest
1 голос
/ 15 ноября 2011

У меня есть Zend Soap Server и я создал операцию setUser ().Эта операция в конечном итоге будет использовать запрошенные данные и вставит новый объект User.Поэтому я хочу запросить массив со значениями для объекта.

Пример:

$request = array("firstname" => "John", "lastname" => "Doe");
setUser($request) { ... }

Следующий запрос в основном работает для массива

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="...">
   <soapenv:Header/>
   <soapenv:Body>
      <soap:setUser soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <setArray xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
            <item xsi:type="xsd:string">John</item>
            <item xsi:type="xsd:string">Doe</item>
         </setArray>
      </soap:setUser>
   </soapenv:Body>
</soapenv:Envelope>

При сбросемассив в моем php-коде я получаю только числовые ключи значений.

[0] => John
[1] => Doe

Есть ли способ указать ключ?Я уже пробовал:

<element name="firstname" xsi:type="xsd:string">John</element>

Я хочу достичь:

[firstname] => John
[lastname] => Doe

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 08 июля 2016

Вы можете сделать stdClass() из массива, например, так:

function toObject($array) {
    foreach ($array as $key=>$value)
        if (is_array($value))
            $array[$key] = toObject($value);
    return (object)$array;
}

Затем вы можете вернуть этот объект, и он будет экспортирован в XML при обработке ответа сервера следующим образом:

  <firstname xsi:type="xsd:string">lastname</firstname> 
  <lastname xsi:type="xsd:string">Doe</lastname> 

Я использую Zend_Soap_Server().

0 голосов
/ 05 декабря 2011

Я не уверен, каково точное решение с Zend_SOAP_Server, но я думаю, что вы хотите использовать тип HashMap, а не Array, который намного ближе к тому, что PHP подразумевает под «массивом» (я пришелпри похожих проблемах с NuSOAP: либо ключи массива отбрасываются, либо они используются в качестве имен элементов, оба из которых являются недопустимыми представлениями типа PHP «массив»)

Вы хотите получить такое представление:

 <hash xmlns:ns2="http://xml.apache.org/xml-soap" xsi:type="ns2:Map">
 <item>
  <key xsi:type="xsd:string">firstname</key> 
  <value xsi:type="xsd:string">John</value> 
 </item>
 <item>
  <key xsi:type="xsd:string">lastname</key> 
  <value xsi:type="xsd:string">Doe</value> 
 </item>
 </hash>

Большинство серверов SOAP, похоже, декодируют это нормально, даже если их клиентская реализация не использует его по умолчанию.

Либо это, либо вам нужно определить собственную схему документа далеекак это:

 <userStruct xsi:type="myNamespace:userStruct">
 <firstname xsi:type="xsd:string">John</value></firstname>
 <lastname>Doe</lastname>
 </userStruct>

Лично я склонен считать, что SOAP создает больше проблем, чем решает, но YMMV.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...