Къде да поставите 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 към местоположение на файл работи добре. Уверете се, че a) разрешенията са зададени правилно и b) използвате абсолютния път към файла (или правилния относителен път). - person Frug; 21.01.2015

Оказа се, че имам грешна конфигурация в моя Apache сървър. Пренасочваше заявката ми към "localhost" към друг виртуален хост на същия сървър. Когато се опитах да заредя WSDL файла от моя браузър, той работи добре, но от скрипта на сървъра не. Все още не работи, но поне постигнах напредък.

person BrianVPS    schedule 28.12.2011