Задать вопрос
Screamie
@Screamie
Full-stack разработчик

SOAP HTTP Bad Request. Почему не вызываются функции сервиса?

Поступило задание подключить на сайт трекинг почтовых отправлений.

Дано: Удаленный веб сервис с четырьмя узлами. HTML, XML, JSON и SOAP.
Выбрал SOAP, по ряду причин в основном из-за поддержки в PHP. И понеслась...

Вот WSDL delivery.aero/tracking/soap.svc?singleWsdl

Казалось бы все стандартно, шлём туда необходимые запросы, назад получаем ответы. Но...

// Получаю объект SOAP с заданными в wsdl параметрами (wsdl лежит на удаленном сервере)
$client = new SoapClient("some.wsdl", array("trace" => true, "soap_version" => SOAP_1_2));

// проверяю наличие методов
var_dump($client->__getFunctions());

/* В дампе лежит следующее
array(4) {
  [0]=>
  string(74) "GetPublicTrackingResponse GetPublicTracking(GetPublicTracking $parameters)"
  [1]=>
  string(101) "GetPublicTrackingLocalizedResponse GetPublicTrackingLocalized(GetPublicTrackingLocalized $parameters)"
  [2]=>
  string(56) "GetTrackingResponse GetTracking(GetTracking $parameters)"
  [3]=>
  string(83) "GetTrackingLocalizedResponse GetTrackingLocalized(GetTrackingLocalized $parameters)"
}
*/

// По wsdl смотрю что GetPublicTracking ждет на вход две строки
$xml = $client->__soapCall('GetPublicTracking', array('123', '123'))


И сразу получаю ошибку:
Uncaught SoapFault exception: [s:Sender] The SOAP action specified on the message, '', does not match the HTTP SOAP Action, 'https://....some...url'

Не беда, думаю! Не видит action, сейчас покажем.

// Запиливаю заголовок с путем до нужного action-a и начинаю смутно подозревать что здесь что-то не то
$actionHeader = new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', 'https://path-to-action-');
$client2->__setSoapHeaders($actionHeader);


Получаю вот такую красоту:
Uncaught SoapFault exception: [s:Sender] The message with To '' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.

На этом мои скромные познания в SOAP заканчиваются и иду курить Stackoverflow. На русском по сабжу очень мало. На заморском много, но половина рекомендует пилить что-то на сервисе, а у меня к нему доступа нет. Вторая половина рекомендует воткнуть еще один заголовок.

Нет проблем, втыкаем
// Естественно массивом в нем теперь лежит два заголовка вот последний
$actionHeader[] = new SoapHeader('http://www.w3.org/2005/08/addressing','To','https:service-address/soap.svc');
$client->__setSoapHeaders($actionHeader);


И результат:
Uncaught SoapFault exception: [HTTP] Bad Request in C:\path-to-local-server

Дальше много плясок с бубном, но безрезультатно. Говорят ошибка может быть в синтаксисе, но где она я не вижу. Пробовал менять метод вызова на $client-> __call(), Так же пробовал вызывать напрямую через $client->GetPublicTracking('123','123'); Без разницы. Пробовал остальные методы. Та же история

Кто-нибудь может подсказать, как мне все таки получить данные по запросу? И добраться до этого чертового сервиса
  • Вопрос задан
  • 1244 просмотра
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
madmages
@madmages
Человек прямоходящий
https://services.soft.aero/mp1/delivery/tracking/T...
метод GetPublicTracking идет по урлу выше, а урл выше не открывается.

вообще, не рекомендую soap к использованию. json гибче будет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы