Куда поместить WSDL и как ссылаться на SoapClient

Я уверен, что это глупый вопрос новичка, но я впервые работаю с SOAP, поэтому, думаю, я соответствую требованиям. У меня чертовски много времени, пытаясь загрузить локальный файл WSDL из моего класса PHP. Я не понимаю, где он ищет файл или как я могу ссылаться на него локально. Я мог бы указать абсолютный путь, используя полный URL-адрес веб-сайта, но это кажется излишним, и это будет работать ТОЛЬКО на этом сайте. Я бы предпочел ссылаться на файл, используя относительный путь.

Я использую PHP с магазином Magento. Класс, который обрабатывает связь с сервером SOAP, — Namespace_Module_Model_Carrier_Fedex_Addressvalidation, расположенный по адресу app/code/local/Namespace/Module/Model/Carrier/Fedex/Addressvalidation.php. Экземпляр этого класса создается с помощью Mage::getModel('shippingrates/carrier_fedex_addressvalidation') из класса Namespace_Module_Model_Carrier_Fedex. Расположение WSDL определяется в верхней части класса проверки адреса:

protected $_wsdl = 'AddressValidationService_v2.wsdl';

В конструкторе модели я инициализирую SoapClient:

$this->_client = new SoapClient($this->_wsdl);
$this->_client->__setLocation($this->getServiceLocation());//returns a remote URL for their test server

Файл находится в том же каталоге, что и файл Addressvalidation.php, но я также попытался найти его в том же каталоге, что и скрипт Fedex.php, а также по адресу app/code/local/, но ничего не работает. Я пытался установить для переменной WSDL значение ./AddressValidationService_v2.wsdl, а также различные другие параметры, но всегда получаю такое исключение:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from './AddressValidationService_v2.wsdl' : failed to load external entity

Если кто-то может помочь мне понять область действия и то, где SoapClient ищет файлы, я думаю, что у меня будет лучшее понимание того, куда их поместить и как на них ссылаться.


person BrianVPS    schedule 28.12.2011    source источник


Ответы (2)


Обычно файл WSDL указывает на URL-адрес, а не на локальный файл.

Итак, если у вас есть веб-служба, настроенная и работающая на вашем локальном ПК, вы можете настроить свой клиент для тестирования следующим образом:

<?php

$wsdl = "http://127.0.0.1/api/service.wsdl";

$options = [
    'trace'      => 1,
    'exceptions' => true,
    'cache_wsdl' => WSDL_CACHE_NONE,
];

$client = new SoapClient($wsdl, $options);

$return = $client->getDetails([$id = 1234]);

echo "Request headers: " . print_r($client->__getLastRequestHeaders(), 1), "\n";
echo "Request: " . $client->__getLastRequest(), "\n";
echo "Response headers: " . print_r($client->__getLastResponseHeaders(), 1), "\n";
echo "Response: " . $client->__getLastResponse(), "\n";

На самом деле это из рабочего PHP-скрипта на моем компьютере. Я тестирую свой собственный SoapServer таким образом, и он работает. «getDetails» — это метод, определенный в файле WSDL, и он ожидает один параметр, который я передаю как $id.

Строки отладки выводятся после звонка, что мне очень помогает.

person Dmitri Snytkine    schedule 28.12.2011
comment
В этом случае файл WSDL хранится локально, но сервер, на который отправляются все запросы, удален. Для этого я инициализирую SoapClient параметром location (см. вопрос выше... Я отредактировал его, чтобы отразить это). - person BrianVPS; 28.12.2011
comment
Чтобы продолжить разработку, я поместил файл в корень веб-сервера и ссылаюсь на него с помощью http:///localhost/wsdl/AddressValidationService_v2.wsdl. Теперь я получаю сообщение об ошибке Не удалось найти в 'http:///localhost/wsdl/AddressValidationService_v2.wsdl'.... не удалось найти ЧТО?? - person BrianVPS; 28.12.2011
comment
Вам нужно указать полный URL-адрес, включая http://, а не только «localhost/wsdl/». - person Dmitri Snytkine; 28.12.2011
comment
Просто попробуйте получить доступ к своему wsdl с помощью браузера, поместите localhost/wsdl/AddressValidationService_v2.wsdl в браузере. адрес, и если вы видите свой файл wsdl в браузере, просто используйте этот URL-адрес в своем SoapClient. Если вы не видите его в браузере, значит, есть проблема: либо ваш сервер apache не работает, либо адрес неверный. - person Dmitri Snytkine; 28.12.2011
comment
Я... он превращал мои URL-адреса в ссылки и удалял часть протокола. Я поставил пробел между двумя косыми чертами, чтобы этого не было в комментарии, но то, что я на самом деле использую в своем сценарии, правильно. Теперь он находит файл WSDL, но я получаю новую ошибку Не удалось найти в.... Я не знаю, на что это жалуется. - person BrianVPS; 28.12.2011
comment
Скорее всего, это означает, что ваш файл wsdl недействителен. Создать правильный файл wsdl вручную непросто. Используете ли вы какой-либо инструмент для создания wsdl? - person Dmitri Snytkine; 28.12.2011
comment
Я не генерировал его... он был отправлен мне FedEx, когда я подписался на ключ разработчика. Должен ли я изменить его в соответствии со своими потребностями? Если да, то что мне нужно изменить? - person BrianVPS; 28.12.2011
comment
Ясно, значит, веб-служба не на вашем локальном сервере. Я думаю, они отправляют его вам только для того, чтобы вы могли понять, какие функции у них есть, какие параметры они ожидают, какие объекты возвращаются и т. д. Он не предназначался для фактического использования для тестирования. Ваш единственный выбор сейчас - это фактически указать wsdl на фактический сервер FedEx, я имею в виду указать на прочитанный файл и попробовать, работает ли с ним ваш клиент. - person Dmitri Snytkine; 28.12.2011
comment
Ах, хорошо, это имеет больше смысла. Они никогда не говорили мне URL-адрес для доступа к их файлу WSDL, и все их образцы кода ссылаются на локальную копию, но, возможно, это неправильно. Я свяжусь с ними для получения дополнительной помощи. Спасибо за все ваши! - person BrianVPS; 28.12.2011
comment
указание uri на местоположение файла работает отлично. Убедитесь, что а) разрешения установлены правильно и б) вы используете абсолютный путь к файлу (или правильный относительный путь). - person Frug; 21.01.2015

Оказывается, у меня была неправильная конфигурация на моем сервере Apache. Он перенаправлял мой запрос на «localhost» на другой виртуальный хост на том же сервере. Когда я попытался загрузить файл WSDL из своего браузера, он работал нормально, но из сценария на сервере - нет. Это все еще не работает, но, по крайней мере, я добился прогресса.

person BrianVPS    schedule 28.12.2011