php SoapClient: не удалось загрузить из внешнего объекта (где конечная точка разрешается в другое место)

У меня есть WSDL, расположенный примерно так:

https://provider.web-service.domain/path/ServiceName?wsdl

Там есть такая строка:

<wsdl:import namespace="http://name/space/service/" location="ServiceName.wsdl"></wsdl:import>

т.е. Он пытается импортировать другой wsdl по адресу:

https://provider.web-service.domain/path/ServiceName.wsdl

Итак, при инициализации SoapClient я получаю следующую ошибку:

 PHP Fatal error:  SOAP-ERROR: Parsing WSDL:
 Couldn't load from 'https://provider.web-service.domain/path/ServiceName.wsdl' :
 failed to load external entity "https://provider.web-service.domain/path/ServiceName.wsdl"

В данный момент я пытаюсь решить эту проблему с помощью своего поставщика WSDL, но есть ли обходной путь для этой проблемы?

Я предполагаю, что единственное решение для них - предоставить путь, который фактически указывает на доступный ресурс. И что на самом деле я мало что могу с этим поделать.

Твои мысли.

Связанный:

ОБНОВЛЕНИЕ

Поставщик говорит, что PHP SOAP Client SUX (по существу).

Название изменено с:

  • php SoapClient: не удалось загрузить из внешнего объекта; к
  • php SoapClient: не удалось загрузить из внешнего объекта (где конечная точка разрешается в другое место)

Таким образом, PHP SoapClient не знает, что URL-адрес wsdl разрешается в другое место, поэтому он пытается импортировать файл из исходного местоположения.

Поскольку ресурс не существует в исходном местоположении, выдается ошибка.

В качестве обходного пути они предоставили WSDL, чтобы мы могли установить его на наш сервер.

Но эта проблема требует лучшего решения.

ОБНОВЛЕНИЕ 2

Я хотел бы переформулировать вопрос для ясности:

Меня попросили использовать следующий URL-адрес WSDL:

[1] https://provider.web-service.domain/path/ServiceName?wsdl

В следующем месте есть два WSDL.

[2] https://provider.web-service.domain/path/ServiceName/another/diff/path/prefix_ServiceName.wsdl
[3] https://provider.web-service.domain/path/ServiceName/another/diff/path/ServiceName.wsdl
  • [1] превращается в [2]; потом
  • [2] импорт [3]

При передаче [1] в SoapClient() это FATAL (как описано ранее)

При передаче [2] в SoapClient() это работает.


person denormalizer    schedule 21.06.2013    source источник


Ответы (1)


То, что мне пришлось сделать в прошлом, и что вы МОГЛИ бы сделать, если бы действительно хотели потратить на это свое время, это: создать класс-оболочку для soapclient и предварительно обработать wsdls. например

class SoapClientCompatibility extends SoapClient{

    public function __construct($wsdl, $options){
        // do things here, like:
        // download the wsdl using curl
        // modify/check it, then hand it over as the $wsdl to parent::__construct
    }

}
person CobaltBlueDW    schedule 04.06.2014