2011-08-15 37 views
0

我正在用PHP編寫一個SOAP API,並且卡住了。我試圖返回一個字典對象與此格式:用PHP和SOAP返回一個字典對象

Key: # 
Value: 
    Id: # 
    Title: some title 
    Text: blah 

我一直在尋找通過其他網站的SOAP API服務的WSDL和XSD文件,我已經找到了如何寫Dictionary對象進入他們,現在我卡在PHP部分。 My Dictionary在WSDL/XSD中設置爲一個整數作爲鍵和一個Comment對象作爲值,所以它應該是一個int key/Comment值對的數組......但我無法弄清楚在PHP中完成。下面是我在我的XSD文件得到了結構:

<xs:complexType name="DictionaryResponse"> 
    <xs:annotation> 
     <xs:appinfo> 
     <IsDictionary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">true</IsDictionary> 
     </xs:appinfo> 
    </xs:annotation> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="unbounded" name="DictionaryResult"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="Key" type="xs:int" /> 
      <xs:element name="Value" nillable="true" type="tns:Comment" /> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 

Comment對象只包含的一些信息,比如一個ID,發帖者ID和姓名,文本,日期等我想要的字典鍵爲註釋ID,並且該值爲註釋對象本身。

有人可以幫助我解決這個問題,只是幫我把我的頭圍繞在PHP如何工作。謝謝!

回答

0

好吧,既然我沒有更好的辦法,我一直在修補它並找出答案。我擁有大部分正確的元素,只是順序錯誤。

我的WSDL保持不變,我不需要改變任何東西。在我的第一XSD,我改變輸出元件以這樣的:

<xs:element name="GetDictionaryResponse"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="GetDictionaryResult" nillable="true" type="q2:DictionaryResponse" xmlns:q2="http://reachchallenges.infectionist.com/api/" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

基本上我返回從第二XSD命名GetDictionaryResult一個DictionaryResponse目的,DictionaryResponse被包裹在一個GetDictionaryResponse對象。我的第二個XSD是我要去哪裏錯了,SOAP是混亂的,但我結束了這些元素:

<xs:complexType name="DictionaryResponse"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="status" nillable="true" type="xs:string" /> 
    <xs:element minOccurs="0" name="Data" type="tns:ArrayOfKeyValueOfintComment" /> 
    </xs:sequence> 
</xs:complexType> 
<xs:element name="DictionaryResponse" nillable="true" type="tns:DictionaryResponse" /> 

<xs:complexType name="ArrayOfKeyValueOfintComment"> 
    <xs:annotation> 
    <xs:appinfo> 
     <IsDictionary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">true</IsDictionary> 
    </xs:appinfo> 
    </xs:annotation> 
    <xs:sequence> 
    <xs:element minOccurs="0" maxOccurs="unbounded" name="ArrayOfKeyValueOfintComment"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Key" type="xs:int" /> 
      <xs:element name="Value" nillable="true" type="tns:Comment" /> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 
<xs:element name="ArrayOfKeyValueOfintComment" nillable="true" type="tns:ArrayOfKeyValueOfintComment" /> 

的DictionaryResponse對象包含一個名爲「狀態」的字符串,我只把那裏作爲測試。它還包含一個無界的ArrayOfKeyValueOfintComment對象,這是魔術發生的地方。最後,PHP本身:

class GetDictionaryResponse { 
    var $GetDictionaryResult; 

    function GetDictionaryResponse() { 
    $this->GetDictionaryResult = new GetDictionaryResult(); 
    } 
    } 

class GetDictionaryResult { 
    var $status; 
    var $Data; 

    function GetDictionaryResult() { 
    $this->status = (string)"Ok"; 
    } 

    function AddItem($k, $v) { 
    $d = new ArrayOfKeyValueOfintComment($k, $v); 
    $this->Data[] = $d; 
    } 
    } 

class ArrayOfKeyValueOfintComment { 
    var $Key, $Value; 

    function ArrayOfKeyValueOfintComment($k, $v) { 
    $this->Key = $k; 
    $this->Value = $v; 
    } 
    } 

function GetDictionary() { 
    $ret = new GetDictionaryResponse(); 
    for($i = 0; $i < 3; $i++) { 
    $c = new Comment(array([comment elements])); 
    $ret->GetDictionaryResult->AddItem($i, $c); 
    } 

    return $ret; 
    } 

希望它看起來不太混亂。本質上,收益看起來是這樣的:

GetDictionaryResponse-> 
    GetDictionaryResult-> 
    string status; 
    Dictionary<int, Comment> Data; 

我可以從淨消耗它,並得到了有效的解釋是這樣的:

DictionaryResponse R = client.GetDictionary(); 註釋c = r.Data [0];

希望我已經幫助了一些未來的讀者!