在php中使用Soap 1.2生成客户端

在php中使用Soap 1.2生成客户端,php,soap,soap-client,Php,Soap,Soap Client,您能否告诉我,是否有一种工具可以生成满足以下要求的soap客户端: 肥皂1.2 客户机基于三种不同的服务(SO3WSDL) 这些服务具有共享类型 我发现: 及 我找不到的是最后两点。 任何帮助都将不胜感激,因为我无法理解如何从不同的来源创建它,以及如何调用特定的服务。我正在尝试了解您可能想要做什么 第一:一个WSDL===一个服务===一个SoapClient。您不能在Soap客户端级别上混合使用两个WSDL位置,但根据您的应用程序,可能会在更高级别上连接每个服务的结果 所以,如果您有三个

您能否告诉我,是否有一种工具可以生成满足以下要求的soap客户端:

  • 肥皂1.2
  • 客户机基于三种不同的服务(SO3WSDL)
  • 这些服务具有共享类型
  • 我发现:

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

    我正在尝试了解您可能想要做什么

    • 第一:一个WSDL===一个服务===一个SoapClient。您不能在Soap客户端级别上混合使用两个WSDL位置,但根据您的应用程序,可能会在更高级别上连接每个服务的结果

      所以,如果您有三个WSDL,那么您必须实例化三个要使用的SoapClient类。它不像单一的通用HTTP客户机那样可以向任何现有Web服务器发出请求

    • 第二:除非向SoapClient提供类映射,否则任何请求的返回值都只是stdClass和array的混合。WSDL中可能定义了一些类型,但是PHP不会将它们映射到任何东西,除非您定义它

      我建议将类映射与您自己定义的类一起使用,这些类与WSDL中的ComplexType定义相匹配。有一些代码生成器可以通过谷歌搜索来完成这项工作,但Soap标准很复杂,WSDL的定义也很复杂,因此您可能会手工完成工作

      如果数据结构很小,那么没有类映射就完全可以生存

    • 第三:如果三个WSDL共享数据类型,这不会以任何方式影响PHP。由于没有类映射,响应是stdClass和Array,并且请求参数可以相同,因此您不会从这些信息中获得任何好处

      另一方面,如果您采用类映射的方式,我希望共享类型将导致生成相同的类,因此您还会在PHP级别上看到服务a的ComplexType与服务B的ComplexType相同


    我无法测试我的解决方案,因为我没有运行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");
    ?>
    
    
    
    非常感谢。你能告诉我是否有避免创建响应包装的选项吗?就像我得到的AuthTokenResponse里面有一个AuthToken。我希望直接使用AuthToken。抱歉,我无法理解您的要求。像我的函数一样,所有函数都返回某种形式的ObjectResponse,该ObjectResponse具有对象的属性。例如,authorizeUser返回包含AuthToken的AuthTokenResponse。这有点多余。在Java中,您可以告诉它将所有内容都包装在一个直接返回AuthToken的对象中,因为它在内部处理展开。例如,正如我所理解的:函数返回数据(即对象),您只需要从中
    AuthToken
    变量yes?因此,您可以使用
    get\u object\u vars
    函数将这些变量推送到数组中。如果你做不到这一点,那么最好是用返回数据的结构发布另一个问题。