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

时间:2012-10-03 09:48:22

标签: php soap soap-client

您能告诉我是否有工具来生成具有这些要求的soap客户端:

  1. soap 1.2
  2. 客户端基于三种不同的服务(所以3 wsdl)
  3. 这些服务有共享类型
  4. 我发现了:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

    我建议使用带有您自己定义的类的类映射,这些类与WSDL中的ComplexType定义相匹配。有些代码生成器可以用Google搜索来完成工作,但是Soap标准很复杂,WSDL的定义也是如此,所以你最终可能会手工完成工作。

    如果数据结构很小,你可以在没有类图的情况下完美地生活。

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

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

答案 1 :(得分: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");
?>