Как передать массив в качестве значения в запрос soapclient PHP?

Как передать массив в качестве значения в запрос soapclient PHP?

У меня есть soapclient, созданный и связанный уже. Затем я пытаюсь сделать вызов метода webservice, который ожидает 3 параметра (строка, строка, hashmap).

Вот что я ожидал от работы ниже. Но при просмотре вывода xml узел params пуст.

soapclient->doSomething(array('id' => 'blah', 'page' => 'blah', 'params' => array('email' => 'test@test.com', 'password' => 'password', 'blah' => 'blah'))); 

Тело xap soap заканчивается так (обратите внимание на пустой элемент params):

 <SOAP-ENV:Body><ns1:doSomething> <id>blah</id> <page>blah</page> <params/> </ns1:register></SOAP-ENV:Body> 

Для веб-сервисов JAX-WS это может быть проблема с входным параметром hashmap. Созданная схема xsd кажется неправильной для хэшмапов. Размещение карты в объекте-оболочке заставляет JAX-WS выводить правильный xsd.

 public class MapWrapper { public HashMap<String, String> map; } // in your web service class @WebMethod(operationName = "doSomething") public SomeResponseObject doSomething( @WebParam(name = "id") String id, @WebParam(name = "page") String page, @WebParam(name = "params") MapWrapper params { // body of method } 

Тогда PHP-код будет успешным. Я обнаружил, что мне не нужен SoapVar или SoapParam, и я не мог заставить любой из этих методов работать без MapWrapper.

 $entry1['key'] = 'somekey'; $entry1['value'] = 1; $params['map'] = array($entry1); soapclient->doSomething(array('id' => 'blah', 'page' => 'blah', 'params' => $params)); 

Вот правильный xsd, сгенерированный с помощью обертки

 <xs:complexType name="mapWrapper"> <xs:sequence> <xs:element name="map"> <xs:complexType> <xs:sequence> <xs:element name="entry" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="key" minOccurs="0" type="xs:string"/> <xs:element name="value" minOccurs="0" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> 

Вот некорректная схема, созданная JAX-WS с помощью только хэш-карты

 <xs:complexType name="hashMap"> <xs:complexContent> <xs:extension base="tns:abstractMap"> <xs:sequence/> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="abstractMap" abstract="true"> <xs:sequence/> </xs:complexType> 

Последняя записка. Обертка HashMap <String, String> работала с этим решением, но HashMap <String, Object> – нет. Объект сопоставляется с xsd: anyType, который входит в веб-сервис java как объект схемы xsd, а не только Object.

В зависимости от определения webservice параметр hashmap может иметь определенную структуру / кодировку, которые не могут быть непосредственно созданы из массива. Возможно, вы захотите проверить WSDL на этом и взглянуть на классы SoapVar и SoapParam для получения дополнительных опций в построении параметров Soap.