Видеокодер, который мне нужно запросить у 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) ??
Я перепробовал все, но все показывают одно и то же сообщение об ошибке.