Я привык писать PHP-код, но не часто использую объектно-ориентированное кодирование. Теперь мне нужно взаимодействовать с SOAP (как клиент), и я не могу правильно понять синтаксис. У меня есть файл WSDL, который позволяет мне правильно настроить новое соединение с помощью класса SoapClient. Однако я не могу сделать правильный вызов и вернуть данные. Мне нужно отправить следующие (упрощенные) данные:
- Контактный ID
- Контактное лицо
- Общее описание
- Количество
В документе WSDL определены две функции, но мне нужна только одна («FirstFunction» ниже). Вот сценарий, который я запускаю, чтобы получить информацию о доступных функциях и типах:
$client = new SoapClient("http://example.com/webservices?wsdl");
var_dump($client->__getFunctions());
var_dump($client->__getTypes());
И вот результат, который он генерирует:
array(
[0] => "FirstFunction Function1(FirstFunction $parameters)",
[1] => "SecondFunction Function2(SecondFunction $parameters)",
);
array(
[0] => struct Contact {
id id;
name name;
}
[1] => string "string description"
[2] => string "int amount"
}
Скажем, я хочу позвонить в FirstFunction с данными:
- Контактный ID: 100
- Контактное лицо: Джон
- Общее описание: бочка с маслом
- Количество: 500
Какой будет правильный синтаксис? Я пробовал всевозможные варианты, но оказалось, что структура мыла довольно гибкая, поэтому есть очень много способов сделать это. По мануалу тоже не понял ...
ОБНОВЛЕНИЕ 1: пробовал образец из ММК:
$client = new SoapClient("http://example.com/webservices?wsdl");
$params = array(
"id" => 100,
"name" => "John",
"description" => "Barrel of Oil",
"amount" => 500,
);
$response = $client->__soapCall("Function1", array($params));
Но я получаю такой ответ: Object has no 'Contact' property
. Как вы можете видеть в выводе getTypes()
, есть struct
вызываемыйContact
, поэтому я думаю, мне нужно как-то прояснить, что мои параметры включают данные контакта, но вопрос в том, как?
ОБНОВЛЕНИЕ 2: я также пробовал эти структуры, такая же ошибка.
$params = array(
array(
"id" => 100,
"name" => "John",
),
"Barrel of Oil",
500,
);
Так же как:
$params = array(
"Contact" => array(
"id" => 100,
"name" => "John",
),
"description" => "Barrel of Oil",
"amount" => 500,
);
Ошибка в обоих случаях: объект не имеет свойства «Контакт».
Вы также можете использовать сервисы SOAP таким образом:
Это пример реального сервиса, и он работает.
Надеюсь это поможет.
источник
Сначала инициализируйте веб-службы:
Затем установите и передайте параметры:
Обратите внимание, что имя метода доступно в WSDL как имя операции, например:
источник
Я не знаю, почему мой веб-сервис имеет ту же структуру, что и вы, но ему не нужен параметр Class, а просто массив.
Например: - Мой WSDL:
Я var_dump:
Вот результат:
Итак, в моем коде:
но это успешно!
источник
прочитайте это;-
http://php.net/manual/en/soapclient.call.php
Или
Это хороший пример для функции SOAP «__call». Однако это устарело.
источник
Сначала используйте SoapUI, чтобы создать проект мыла из файла wsdl. Попробуйте отправить запрос поиграть с операциями wsdl. Посмотрите, как XML-запрос формирует ваши поля данных.
А затем, если у вас возникли проблемы с тем, чтобы SoapClient работал так, как вы хотите, вот как я его отлаживаю. Установите параметр трассировки так, чтобы функция __getLastRequest () была доступна для использования.
Затем переменная $ xml содержит xml, который SoapClient создает для вашего запроса. Сравните этот xml с тем, который был создан в SoapUI.
Для меня SoapClient, похоже, игнорирует ключи ассоциативного массива $ params и интерпретирует его как индексированный массив, вызывая неправильные данные параметров в xml. То есть, если я переупорядочу данные в $ params , ответ $ будет совершенно другим:
источник
Если вы создадите объект SoapParam, это решит вашу проблему. Создайте класс и сопоставьте его с типом объекта, заданным WebService, инициализируйте значения и отправьте запрос. См. Образец ниже.
источник
У меня была такая же проблема, но я просто обернул такие аргументы, и теперь это работает.
Используя эту функцию:
Вы можете увидеть XML-код запроса независимо от того, меняется он или нет, в зависимости от ваших аргументов.
Используйте [trace = 1, exceptions = 0] в параметрах SoapClient.
источник
Вам нужно объявить контракт класса
или
затем
или
источник
Вам нужен многомерный массив, вы можете попробовать следующее:
в PHP массив - это очень гибкая структура. Обычно с вызовами мыла я использую оболочку XML, поэтому не уверен, что она сработает.
РЕДАКТИРОВАТЬ:
Что вы можете попробовать, так это создать json-запрос для отправки или использовать его для создания xml-запроса на покупку следующего содержания на этой странице: http://onwebdev.blogspot.com/2011/08/php-converting-rss- к json.html
источник
Есть возможность генерировать объекты php5 с помощью класса WsdlInterpreter. Подробнее здесь: https://github.com/gkwelding/WSDLInterpreter
например:
источник
getLastRequest ():
Этот метод работает, только если объект SoapClient был создан с параметром трассировки, установленным на TRUE.
ИСТИНА в этом случае представлена 1
работал у меня.
источник