代码之家  ›  专栏  ›  技术社区  ›  Danny

在PHP SoapClient中分离目标IP和WSDL

  •  1
  • Danny  · 技术社区  · 6 年前

    我需要从PHP查询视频编码器的状态和设置,它提供了一个SOAP接口。

    schemaLocation 命名外部URL。XSD文件也由供应商提供。

    由于系统必须在没有公共internet连接的情况下运行,因此我修改了所有导入以指向本地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指定为localhost,并将目标计算机和命名空间放在选项中:

    $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();
    

    但是,由于在 getModuleList() 行。

    Apache错误日志:

    [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
    

    这个 PHP docs

    位置 乌里 是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文件所示)??

    我已经试过了,但都显示了相同的错误信息。

    0 回复  |  直到 6 年前