Intereting Posts
CodeIgniter 3: номер ошибки 2014 Команды не синхронизированы; вы не можете запустить эту команду сейчас PHP – печать одного отчета на страницу Написание запроса, содержащего переменную WHERE на основе ввода пользователем Предотвращать хотлинкинг файлов Amazon S3? Проблемы с именем пользователя или с помощью двоеточия при настройке CURLOPT_USERPWD Предлагает ли AMD OpenCL нечто похожее на GPUDirect от CUDA? Почему эхо локальная переменная внутри одной и той же функции не работает? Пустой экран контактной формы SMTP для отправки Изменение состояния флажка при загрузке страницы с использованием PHP перед другими функциями PHP: массив для самостоятельной привязки Ошибка аутентификации с мылом Включить XSL на Ubuntu 12.04 Использование do_shortcode в wordpress через вызов ajax Сохранить строку вывода cURL Display в переменной PHP Zend Framework 2 отображает представление в представлении

Передача пользовательских типов в PHP SOAP

У меня возникли проблемы с пониманием того, как передавать пользовательские типы в вызовах 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 действительно делает какую-либо проверку на ответ – только запрос.