2013-10-17 168 views
0

我一直在研究一個項目(我將保留具體的詳細信息,包括隨機數據),這涉及到我們的系統(PHP 5.3.x +)與API的集成(他們提供了一個SDK)的一家大公司。他們提供了一個WSDL並聲稱我們需要匹配他們的方法,他們提供了輸出(Soap服務器生成的XML)外觀的示例。Zend Soap服務器/ WSDL

現在,一切都按預期工作。當我從SoapUI(我用來測試的應用程序)發送一個XML請求時,它的所有處理過程都是正確的,但是XML輸出與他們的示例並不緊密匹配,我們相信他們說我們必須接近他們的示例。

基本上,我們創建了我們用一個服務名初始化一個不可知類,並將其初始化成其經由以下使用非類不可知:

/** 
* The following is used to process Soap Server based on config and any optional settings. 
* 
* @param string $className 
* @param array $options 
* @param object $config 
* @return Zend_Soap_Server 
*/ 
public static function init($className, Array $options = null, $config = null) 
{ 
    // Used to define the class and return object. 
    $soap_server  = new Zend_Soap_Server(null, $options); 
    $soap_server->setClass($className, null, (isset($config) ? $config : null)); 
    $soap_server->handle(); 
    exit; 
} 

本身位於輸出響應中的問題。你們如何建議我們構建XML輸出,如果他們對每件事都非常具體?

1.)我們的方法之一是moneyTransferRequest。當我爲此發送XML時,它確實找到了方法並對其進行處理。但是,他們希望它在響應中顯示方法名稱爲moneyTransferResponse,但它會輸出moneyTransferRequestResponse。

2.)我們的輸出(對於作爲對象發回的變量等)有多個變量,例如我們會說$ money。此字段將返回爲:

<money xsi:type="xsd:string">10.0</money> 

他們希望它是:

<ns1:money xsi:type="xsd:string">10.0</money> 
在返回

我感謝任何幫助和輸入的主題。

回答

0

SOAP的關鍵特性是它使用XML,而XML可以有很多不同的樣式,但仍然意味着相同。

我想(但我只能猜測,因爲你沒有提供細節),你的兩個問題可能是不存在的。

1.)響應XML結構的名稱應該與WSDL中提到的名稱一致。您正在發佈WSDL,因此您應該檢查這兩者是否匹配。請注意,重要的入口點是SOAP方法 - 其後的所有內容都是在WSDL本身中定義的,只要正確使用提及的名稱,任何消費客戶端都應該能夠弄清楚。 2)這基本上是相同的,但更容易:XML允許使用名稱空間,並且這些名稱空間可以在多個位置定義,結果不是字面上相同,但每個XML解析器都會明白它們是一樣。因此,您應該檢查響應的XML標題中是否提及了所需的名稱空間「ns1」。每個XML文檔都有一個基本名稱空間,不需要在屬於它的每個元素上重複。

這是<money>元素的情況。您的寫作風格使用該基本命名空間,其寫作風格使用也在XML標頭中引入的命名空間快捷鍵ns1,但未聲明爲基本命名空間。所以只要在兩個響應中都有正確的XML名稱空間的痕跡,我就會認爲它們是等價的。

壞消息是您無法更改PHP SoapServer如何生成XML。你需要創建自己的SOAP服務器實現,我認爲這是完全浪費資源。

+0

您好,非常感謝您的回覆。我終於看完了。我們認爲,除了制定與非標準指導方針相匹配的迴應外,我們還可以做的不多。無論如何,這是非常有用的,併爲我澄清了一些事情。 – Robbie