你能告诉我是否有一种工具可以生成具有这些要求的肥皂客户端:
- 肥皂 1.2
- 客户端基于三种不同的服务(所以 3 wsdl)
- 这些服务具有共享类型
我发现了:
http://php.net/manual/en/class.soapclient.php
和
http://www.php.net/manual/en/soapclient.soapclient.php
我找不到搜索它的东西尤其是最后两点。任何帮助将不胜感激,因为我无法理解如何从不同来源创建它以及如何调用特定服务。
你能告诉我是否有一种工具可以生成具有这些要求的肥皂客户端:
我发现了:
http://php.net/manual/en/class.soapclient.php
和
http://www.php.net/manual/en/soapclient.soapclient.php
我找不到搜索它的东西尤其是最后两点。任何帮助将不胜感激,因为我无法理解如何从不同来源创建它以及如何调用特定服务。
我试图弄清楚你可能想要做什么。
第一:一个 WSDL === 一个服务 === 一个 SoapClient。您不能在 Soap 客户端级别混合两个 WSDL 位置,但根据您的应用程序,可能会在更高级别连接每个服务的结果。
因此,如果您有三个 WSDL,那么您必须实例化三个要使用的 SoapClient 类。它不像可以向任何现有网络服务器发出请求的单个通用 HTTP 客户端。
第二:除非您向 SoapClient 提供类映射,否则任何请求的返回值都只是 stdClass 和数组的混合。WSDL 中可能定义了类型,但 PHP 不会将它们映射到任何东西,除非您定义它。
我建议使用您自己定义的与 WSDL 中的 ComplexType 定义匹配的类映射。有一些代码生成器可能会完成这项工作,但 Soap 标准很复杂,WSDL 的定义也很复杂,因此您最终可能会手动完成工作。
如果数据结构很小,你可以完美地生活在没有 classmap 的情况下。
第三:如果三个 WSDL 共享数据类型,这不会以任何方式影响 PHP。由于没有类映射,响应是 stdClass 和 Array,并且请求参数可以相同,因此您不会从这些信息中获得任何好处。
另一方面,如果您采用类映射的方式,我希望共享类型将导致生成相同的类,因此您还会在 PHP 级别看到来自服务 A 的 ComplexType 与 ComplexType 的相同服务 B。
我无法测试我的解决方案,因为我没有运行 2-3 个 Web 服务,但我认为这个解决方案会起作用(如果我理解正确的话)。如果你能试试,请告诉我。
<?php
class wstest {
function __construct($url) {
$this->soapUrl = $url;
try{
$this->client = new SoapClient($this->soapUrl,array('login' => 'wsuser', 'password' => "some_password", "connection_timeout"=>30,'trace'=>true,'keep_alive'=>false,'features' => SOAP_SINGLE_ELEMENT_ARRAYS));
} catch (Exception $e) {
echo $e->getMessage();
}
}
};
$con = new wstest("http://firstwebservice.com/?wsdl");
$con2 = new wstest("http://secondwebservice.com/?wsdl");
$con3 = new wstest("http://thirdwebservice.com/?wsdl");
?>