0

你能告诉我是否有一种工具可以生成具有这些要求的肥皂客户端:

  1. 肥皂 1.2
  2. 客户端基于三种不同的服务(所以 3 wsdl)
  3. 这些服务具有共享类型

我发现了:

http://php.net/manual/en/class.soapclient.php

http://www.php.net/manual/en/soapclient.soapclient.php

我找不到搜索它的东西尤其是最后两点。任何帮助将不胜感激,因为我无法理解如何从不同来源创建它以及如何调用特定服务。

4

2 回答 2

1

我试图弄清楚你可能想要做什么。

  • 第一:一个 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。

于 2012-10-03T09:59:08.947 回答
1

我无法测试我的解决方案,因为我没有运行 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");
?>
于 2012-10-03T10:00:28.670 回答