Как передать массив в качестве значения в запрос 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.