Разделяйте целевой IP и WSDL в PHP SoapClient - PullRequest
0 голосов
/ 10 ноября 2018

Видеокодер, который мне нужно запросить у PHP для получения статуса и настроек, обеспечивает интерфейс SOAP.

Поставщик предоставляет файл WSDL, который включает 15 схем с schemaLocation именованием внешних URL-адресов. XSD-файлы также предоставляются поставщиком.

Поскольку система должна работать без общедоступного подключения к Интернету, я изменил все операции импорта так, чтобы они указывали на локальный URL, например,

http://localhost/path_to_schemas/xml.xsd
http://localhost/path_to_schemas/settings.xsd
http://localhost/path_to_schemas/inputs.xsd

и пр.

Как использовать PHP SoapClient для запроса кодировщика (-ов), используя локальный WSDL и схемы? Не могу найти никаких подсказок в документации PHP или в другом месте онлайн. В большинстве примеров предполагается, что файл WSDL будет находиться на запрашиваемом устройстве, а в данном случае его нет.

Поэтому я попытался указать WSDL в качестве локального хоста и указать целевой компьютер и пространство имен в параметрах:

$options = array("location" => "192.168.2.161", "uri" => "http://www.appeartv.com/automation/v1");

$sp = new SoapClient("http://localhost/visor/options/optAppearControl/webgui/be/atvSoapSchema/ATV.wsdl", $options);
$result = $sp->getModuleList();

Однако, это не сработало, за исключением «Невозможно разобрать URL» в строке getModuleList().

Apache error_log:

[Sat Nov 10 06:55:05 2018] [error] [client 192.168.2.10] 
PHP Fatal error:  Uncaught SoapFault exception: [HTTP] Unable to parse URL
in /usr/local/webgui/be/testSoap.php:16
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', '192.168.2.161', 'getModuleList', 1, 0)
#1 /usr/local/webgui/be/testSoap.php(16): SoapClient->__call('getModuleList', Array)
#2 /usr/local/webgui/be/testSoap.php(16): SoapClient->getModuleList()
#3 {main}
  thrown in /usr/local/webgui/be/testSoap.php on line 16

Какой URL не может быть проанализирован?

Документы PHP говорят, что:

location - это URL-адрес сервера SOAP, на который отправляется запрос, и uri является целевым пространством имен службы SOAP

Я немного запутался в том, что uri должно быть установлено. «Целевое пространство имен» в файлах xsd и wsdl показывает:

<?xml version="1.0" encoding="UTF-8"?>
<definitions 
  xmlns="http://schemas.xmlsoap.org/wsdl/" 
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
  xmlns:tns="http://www.appeartv.com/automation/v1/wsdl" 
  xmlns:atv="http://www.appeartv.com/automation/v1" 
  name="AppearTV_Automation" 
  targetNamespace="http://www.appeartv.com/automation/v1/wsdl">
  <types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema">
      <import namespace="http://www.appeartv.com/automation/v1" 
        schemaLocation="http://localhost/visor/options/optAppearControl/webgui/be/atvSoapSchema/automationInterface.xsd" />
    </schema>
  </types>

  <!-- system.xsd -->
  <message name="getModuleList">
    <part name="foo" element="atv:getModuleList"/>
  </message>
  and so on...

Так же как и целевое пространство имен atv (как используется в файлах xsd) или http://www.appeartv.com/automation/v1/wsdl (как показано в файле wsdl) или http://www.appeartv.com/automation/v1 (как показано в файлах xsd) ??

Я перепробовал все, но все показывают одно и то же сообщение об ошибке.

...