Передача пользовательских типов в PHP SOAP - PullRequest
5 голосов
/ 22 февраля 2010

У меня проблемы с пониманием того, как передавать пользовательские типы в вызовах PHP SOAP. Может ли кто-нибудь дать мне подсказку (или ссылку на руководство), пожалуйста?

Пример: В моем файле WSDL я определяю тип:

<types>
<schema targetNamespace="http://example.com/CustData"
        xmlns="http://www.w3.org/2000/10/XMLSchema">
  <element name="personalInformation">
    <complexType>
      <all>
        <element name="name" type="xsd:string"/>
        <element name="title" type="xsd:string"/>
        <element name="lang" type="xsd:string"/>
      </all>
    </complexType>
  </element>
</schema>

Я определяю ответное сообщение службы следующим образом:

<message name='getCustDataResponse'>
<part name='Result' type='xsd:personalInformation'/>
<part name='Result1' type='xsd:string'/>
</message>

Отсутствует часть - как инициализировать ответ на стороне сервера SOAP?

Я пытался написать:

$arrRes['Result']['name'] = 'xxx';
$arrRes['Result']['title'] = 'yyy';
$arrRes['Result']['lang'] = 'zzz';
$arrRes['Result']['hehehehe1'] = 'test1';
$arrRes['Result']['hehehehe2'] = 'test2';
$arrRes['Result']['hehehehe3'] = 'test3';
$arrRes['Result']['hehehehe4'] = 'test4';
$arrRes['Result1'] = 'result1';
$arrRes['blablabla'] = 'hahaha';
return $arrRes;

Клиент получает ответ обратно, и когда я его var_dump, он показывает arrRes:

array(2) { ["Result"]=>  array(7) { ["name"]=>  string(3) "xxx" ["title"]=>  string(3) "yyy" ["lang"]=>  string(3) "zzz" ["hehehehe1"]=>  string(5) "test1" ["hehehehe2"]=>  string(5) "test2" ["hehehehe3"]=>  string(5) "test3" ["hehehehe4"]=>  string(5) "test4" } ["Result1"]=>  string(7) "result1" } 

Я ожидал получить ошибку, поскольку инициализированный массив не соответствует определенному ответному сообщению.

Так что я предполагаю, что тип, который я определил в wsdl, вообще не используется - поэтому это должна быть ошибка либо в wsdl, либо в коде клиента или сервера.

Заранее спасибо за совет !!

Nikola

1 Ответ

2 голосов
/ 21 октября 2010

Я мало что сделал с серверной стороной SOAP на php, но вот пример того, как использовать отображение классов с php SoapClient. Я совершенно уверен, что SoapServer работает точно так же. (Возможно, вы даже можете использовать одну и ту же карту классов между сервером и клиентом).

Итак, у вас будет такой класс:

class PersonalInformation
{
public $name;
public $title:
public $lang;
}

Тогда для вашего ответа:

function getCustData()
{
    $response = new PersonalInformation;
    $response->name = "Me";
    $response->title = "Hi World";
    $response->lang = "En-US";

    $arrResult = array();
    $arrResult['Result'] = $response;
    $arrResult['Result1'] = 'lol';
    return $arrResult
}

Тогда просто используйте карту классов, например:

$server = new SoapServer('foo?wsdl', classmap=array('personalInformation' => 'PersonalInformation'));
//I'm not sure whether you have to use the classmap on BOTH server/client
$client = new SoapClient('foo?wsdl', classmap=array('personalInformation' => 'PersonalInformation'));

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

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