Как я могу передать массив как значение в запрос PHP-мыла? - PullRequest
2 голосов
/ 26 февраля 2010

Как передать массив как значение в запрос PHP-мыла?

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

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

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

xml тела мыла заканчивается следующим образом (обратите внимание на пустой элемент params):

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

Ответы [ 2 ]

3 голосов
/ 14 октября 2010

Для веб-сервисов 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 работало с этим решением, а HashMap - нет. Объект сопоставляется с xsd: anyType, который входит в веб-сервис java как объект схемы xsd, а не просто как Object.

0 голосов
/ 03 марта 2010

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

...