为什么即使 wsdl 中的 IP 地址错误,webservice 也会返回数据?

phe*_*mix 3 php wsdl web-services

有一个PHP充当 a 的文件webservice,并且该wsdl文件中有以下几行:

<service name="ClientService">
    <documentation></documentation>
    <!-- partie 8 : Port -->
        <port name="ClientPort" binding="typens:ClientBinding">
            <soap:address location="http://192.168.1.12/imfmobile/webservice/InterfaceTransfererClient.php"/>
        </port>
</service>
Run Code Online (Sandbox Code Playgroud)

问题是webservice和所在计算机的IP地址wsdl是192.168.1.123,并且我从web服务调用函数时获取数据PHP!那么<soap:address标签就没有必要了吗?

Bog*_*dan 5

简短回答:地址只是(对于生成代码和配置的开发人员或工具)可以访问服务的位置以及期望的 URL 类型的指示。

长答案:如果您查看WSDL 架构,您将看到该port元素被定义为仅包含 anamebinding属性,因此这就足够了。您的服务元素可能如下所示,并且在技术上是正确的:

<service name="ClientService">
   <port name="ClientPort" binding="typens:ClientBinding" />
</service>
Run Code Online (Sandbox Code Playgroud)

port也被定义为可扩展元素,允许将其他命名空间的元素添加到其中(例如<soap:address>)。

通常(是的!)<soap:address>应该说明真正的服务暴露在哪里,但不幸的是,由于不同的因素,它并不总是这样发生:

  • 一些服务器地址已更改,人们忘记更新 WSDL 文件(对于合约首次创建的 WSDL);
  • WSDL 由框架自动生成(契约最后),并且框架无法知道 Web 服务暴露在哪个外部地址,因此它添加了一些默认地址以及它知道的信息(例如本地 IP 或计算机名称);
  • 您有一个中央 WSDL,它描述了 3 个相同的已部署服务(一项在 DEV 中,一项在 UAT 中,一项在 PROD 中),并且您无法为所有 3 个服务添加地址;
  • 等等等等

WSDL 主要用于生成客户端代码。完成后,您不再需要 WSDL,您只需要一个用于连接到已部署的 Web 服务的 URL。该地址是工具添加一些默认配置的提示,稍后您可以将其替换为调用的真实地址。

理想情况下,WSDL 中的内容应等于真实地址,但这些信息通常会在维护任务中落下,最终会变得过时。您应该指定一个作为提示,即使它只是<soap:address location="http://localhost/imfmobile/webservice/InterfaceTransfererClient.php"/>.