2012-10-03 68 views
0

你能告訴我,如果有是產生這些要求的SOAP客戶端的工具:在PHP中生成客戶端與SOAP 1.2

  1. SOAP 1.2
  2. 客戶端是基於三種不同的服務(這樣3 WSDL)
  3. 這些服務都共享類型

我發現了:

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

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

我不能找出尋找它是特別是最後兩個點的東西。 任何幫助將不勝感激,因爲我不能不知道如何從不同來源創建它,以及如何調用特定服務。

回答

1

中的ComplexType我無法測試我的解決方案,因爲我沒有運行2-3網絡服務,但我認爲這個解決方案就可以了(如果我理解正確的你)。如果你可以試試,請告訴我。

<?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"); 
?> 
+1

非常感謝。像魅力一樣工作。 – dierre

+0

不客氣。感謝您的反饋。 – F0G

+0

你能告訴我是否有一個選項可以避免創建響應包裝?就像我在那裏獲得一個AuthToken的AuthTokenResponse一樣。我想直接擁有AuthToken。 – dierre

1

我想弄清楚你可能想要做什麼。

  • 第一:一個WSDL ===一個服務===一個SoapClient。您不能在Soap客戶端級別上混合使用兩個WSDL位置,但根據您的應用程序,可能會將每個服務的結果連接到更高級別。

    所以如果你有三個WSDL,那麼你必須實例化三個SoapClient類來使用。它不像一個通用的HTTP客戶端,它可以向任何現有的Web服務器發出請求。第二種:除非你向SoapClient提供了一個類映射,否則任何請求的返回值只是stdClass和數組的混合。 WSDL中可能定義了類型,但除非您定義它,否則PHP不會將它們映射到任何東西。

    我會推薦使用一個類自定義的類來匹配WSDL中的ComplexType定義。有一些代碼生成器可以完成這項工作,但Soap標準是複雜的,WSDL的定義也是如此,因此您最終可能會手工完成工作。

    如果數據結構很小,則可以在沒有類圖的情況下生活。

  • 第三:如果三個WSDL共享數據類型,這將不會以任何方式影響PHP。由於沒有classmap,響應是stdClass和Array,並且Request參數可以相同,所以您不會從這些信息中獲得任何好處。

    如果另一方面你走的類圖的方式,我希望共享類型將導致生成相同的類,所以你也會在PHP級別看到服務A的ComplexType是相同的以服務B.