程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了PHP SoapClient 不加载 WSDL大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决PHP SoapClient 不加载 WSDL?

开发过程中遇到PHP SoapClient 不加载 WSDL的问题如何解决?下面主要结合日常开发的经验,给出你关于PHP SoapClient 不加载 WSDL的解决方法建议,希望对你解决PHP SoapClient 不加载 WSDL有所启发或帮助;

我有这个 WSDL:

<wsdl:deFinitions xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:tns="http://sei.esempio.it/" 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:ns2="http://schemas.xmlsoap.org/soap/http" 
    xmlns:ns1="http://esempio.it/" name="XServiziService" 
    targetnamespace="http://sei.esempio.it/">
<wsdl:import location="http://example.lan:8082/XServizi?wsdl=Sei.wsdl" 
             namespace="http://esempio.it/"> </wsdl:import>
<wsdl:binding name="XServiziServiceSoapBinding" type="ns1:Sei">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="HelloWorldOperation">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="HelloWorldOperation">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="HelloWorldOperationResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:service name="XServiziService">
  <wsdl:port binding="tns:XServiziServiceSoapBinding" name="XServiziPort">
    <soap:address location="http://example.lan:8082/XServizi"/>
  </wsdl:port>
</wsdl:service>
</wsdl:deFinitions>
@H_404_5@

我尝试在 PHP 中使用 SoapClIEnt 导入,但出现此错误:

SOAP 错误:解析 WSDL:无法从“https://example.lan:8083/XServices?wsdl”加载:无法加载外部实体“https://example.lan:8083/XServices?wsdl” "

我还添加了登录并传入 SoapClIEnt。我不知道为什么,对于其他 WSDL,它可以工作。

我也不能用 SoapUI 导入。我收到此错误:

错误加载 [http://example.lan:8082/XServices?wsdl=Sei.wsdl]: org.apache.xmlbeans.XmlException: org.apache.xmlbeans.XmlException: 错误: 没有关闭标签。>

我也在 SoapUI 中禁用了代理,但它不起作用。

有什么建议吗?

解决方法

根据错误消息,问题与您发布的 WSDL 文件中的 <wsdl:import> 相关。您的 WSDL 由两部分组成:您正在查看的部分和可在 URL http://example.lan:8082/XServizi?wsdl=Sei.wsdl

中找到的部分

您的错误消息显示了两种不同的内容。

一个 https://example.lan:8083/XServices?wsdl 有问题,另一个 http://example.lan:8082/XServices?wsdl=Sei.wsdl 有问题。我不确定您在发布此问题时如何编辑这些 URL 以保护隐私,以及为什么一个在端口 8083 上而另一个在端口 8082 上,但这个想法是 WSDL 的所有部分都需要可访问:

  • 您的工具需要可以访问主 WSDL 的 URL;
  • 主要 WSDL 导入的 URL 也需要您的工具可以访问;

只有这样,您的工具才能读取 WSDL 及其所有部分并生成 SOAP 客户端。

另请注意,某些工具会通过导入 (see here for details) 阻塞 WSDL。对 PHP SoapClient 不够熟悉,但不知道这里是否是这种情况。

由于您无法控制服务,您的选择是以某种方式使这两个 XML 可用于您的工具。

首先确保 URL 可访问。

如果不是这样,那么以某种方式获取他们的内容。拥有它们后,您可以将本地 PHP 服务器中的两个 URL 的内容保存为 main.wsdl(这是您在问题中显示的 WSDL)和 second.xml(这是导入的内容)。然后在您的 main.wsdl 中更改导入位置。例如,如果您将文件在本地公开为 http://localhost:80/main.wsdlhttp://localhost:80/second.xml,那么在 main.wsdl 中您将导入更改为如下所示:

<wsdl:import location="http://localhost:80/second.xml" namespace="http://esempio.it/"></wsdl:import>

然后将 SoapClient 或 SoapUI 指向读取 http://localhost:80/main.wsdl

您可以在磁盘上尝试此操作并将文件并排放置在同一文件夹中,然后将导入更改为:

<wsdl:import location="second.xml" namespace="http://esempio.it/"></wsdl:import>

然后将工具指向磁盘上的 main.wsdl 文件。我不确定这会起作用。从来没有尝试过。 SoapUI 可能能够从同一文件夹中获取文件,我怀疑是 PHP SoapClient。

还可以选择下载两个 XML 文件并将它们合并为一个 WSDL 文件(基本上是手动解析导入),然后仅使用此文件作为工具。不过,您必须知道自己在做什么,才能获得有效且正确的 WSDL 文件。

或者最后,您可以要求服务提供商提供一个您可以使用的 WSDL 文件。没有必要要求他们更改当前的 WSDL,因为很可能他们也有其他客户端,并且为您修复此问题可能会破坏其他人的东西(如上面的链接中所述)。

但这可能只是一个可访问性问题,因此在将这些 URL 与 SOAP 工具一起使用之前,请确保它们可以从您的浏览器访问。

大佬总结

以上是大佬教程为你收集整理的PHP SoapClient 不加载 WSDL全部内容,希望文章能够帮你解决PHP SoapClient 不加载 WSDL所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: