У меня возникли проблемы с пониманием того, как передавать пользовательские типы в вызовах SOAP PHP. Может ли кто-нибудь дать мне подсказку (или ссылку на руководство), пожалуйста?
Пример. В моем 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, либо в коде клиента или сервера.
Заранее благодарю за ваш совет!
Никола
Я не много сделал с серверной частью SOAP на php, но вот пример того, как использовать сопоставление классов с soapClient php. Я уверен, что 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 действительно делает какую-либо проверку на ответ – только запрос.