PHP Soap Client: Как вызвать WebService с классом Derived в качестве параметра? - PullRequest
2 голосов
/ 07 июня 2009

Я использую PHP 5 и хочу вызвать веб-сервис, который определен примерно так:

webmethod ( AbstractBase obj );

Я использую SoapClient (на основе wsdl). Веб-метод ожидает подкласс класса AbstractBase. Тем не менее, в PHP вызов метода soap возвращает мне эту ошибку:

    Server was unable to read request. 
        ---> There is an error in XML document  
        ---> The specified type is abstract: name='AbstractBase'

Я почти уверен, что проблема в том, что я должен указать тип параметра obj в вызове Soap, но я не могу найти волшебное слово, чтобы сделать это так.

    $client = new SoapClient($WSDL, $soapSettings);
    $obj = array(
        'internal_id' => $internalId,
        'external_id' => $externald,
    );
    $params = array(
        'obj'      => $obj  // How do I say it is of type: DerivedClass?
    );

    $response = $client->webmethod($params);

Ответы [ 2 ]

5 голосов
/ 10 июня 2009

Это было хорошее предложение, но оно тоже не сработало. Но это заставило меня двигаться в правильном направлении. Я взял вашу идею, создал 2 класса и попытался явно установить тип объекта с помощью SoapVar и XSD_ANYTYPE. Это почти сработало, но не установило пространство имен (ns1 :) для полей в классе.

ТАК как я в итоге это исправил? Потребовалось 2 вещи.

Я обнаружил замечательного XSD_ANYXML . Это позволяет мне свернуть мой собственный XML для запроса. Само собой не удалось добавить пространство имен xsi в мыльный конверт. Поэтому мне пришлось заставить один параметр быть XSD_STRING, чтобы разбудить код, который строил запрос. Мой рабочий код:

$client = new SoapClient($WSDL, $soapSettings);
$myXml = "
  <ns1:obj xsi:type='ns1:DerivedClass'>
    <ns1:internal_id>$internalId</ns1:internal_id>
    <ns1:external_id>$externalId</ns1:external_id>
  </ns1:obj>
";

$params = array(
    // this is needed to force the XSI namespace in the header (there must be a better way)
    'foo' => new SoapVar('bar', XSD_STRING, 'String, 'http://www.w3.org/2001/XMLSchema-instance'),
    // this uses the XML I created
    'obj' => new SoapVar($myXml, XSD_ANYXML),
);

$response = $client->webmethod($params);
0 голосов
/ 07 июня 2009

Интересно, массив, который вы передаете (вместо объекта), где-то приводится в AbstractBase, а затем выдается ошибка. Вам может потребоваться передать фактический объект вместо:

abstract class AbstractBase {
    public $internal_id;
    public $external_id;
}

class DerivedClass extends AbstractBase { }

$obj = new DerivedClass();
$obj->internal_id = $internalId;
$obj->external_id = $externalId;

$params = array(
   'obj'      => $obj  // Now an instance of DerivedClass
);

$response = $client->webmethod($params);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...