2009-09-22 74 views
8

我想使用nuSOAP v 1.114返回PHP web服務中的文章對象數組。這是我如何設置WSDL:返回PHP Web服務中的對象數組

$server->wsdl->addComplexType(
'ArticleType', 
'complexType', 
'struct', 
'all', 
'', 
array('articleId' => array('name'=>'articleId', 'type'=>'xsd:int'), 
     'heading' => array('name'=>'heading', 'type'=>'xsd:string'), 
     'text' => array('name'=>'text', 'type'=>'xsd:string') 
    ) 
); 


$server->wsdl->addComplexType(
'ArrayOfArticleType', 
'complexType', 
'array', 
'', 
'SOAP-ENC:Array', 
array(), 
array(
    array('ref' => 'SOAP-ENC:arrayType', 
      'wsdl:arrayType' => 'tns:ArticleType[]'  // ArticleType[] 
     )    
    ), 
'tns:ArticleType' 
); 

我的PHP Article類是非常簡單的:

class Article { 
public $articleId; 
public $heading; 
public $text; 

public function __construct($articleId, $heading, $text=NULL) { 
    $this->articleId = $articleId; 
    $this->heading = $heading; 
    $this->text = $text; 
} 
} 

如果我只返回一個新的文章對象,像這樣:

function TestArrayReturn() { 
    $arr = new Article(12345, "Test heading", "Test text."); 
    //$arr2 = array($arr); 
    return $arr; 
} 

功能,註冊爲:

$server->register("TestArrayReturn", array(), array('return'=>'tns:ArticleType'), $namespace, $namespace."#TestArrayReturn", 'rpc', 'encoded', 'Test function'); 

工作正常,並返回文章,就好像它是一個數組。但是,如果我嘗試並返回一個ArrayOfArticleType(TestArrayReturn()中的註釋行),並將該函數註冊爲返回類型tns:ArrayOfArticleType,那麼它將失敗並顯示錯誤:HTTP錯誤:HTTP標頭之後不存在任何數據。

但是,如果我手動創建一個數組的數組,就像這樣:

$arr = array("articleId"=>12345, "heading"=>"Test heading", "text"=>"Test text"); 
$arr2 = array("articleId"=>12345, "heading"=>"Test heading", "text"=>"Test text"); 
return array($arr, $arr2); 

它的工作原理!?我的ArrayOfArticleType WSDL描述有什麼問題,它不允許它正確地序列化ArticleType對象,但正確序列化具有相同屬性的關聯數組(「articleId」,「heading」,「text」)?

對不起所有的代碼,但我覺得有必要找出我忽略的錯誤。任何幫助表示讚賞,我一直在努力爲這項服務設置WSDL幾天。

回答

4

我修正了這個錯誤。對於任何感興趣的人來說,這似乎是NuSOAP中的一個錯誤。您必須將函數的returnType註冊爲xsd:Array才能正確返回數組,即使正確的WSDL將其構造爲'tns:ArrayOfArticleType'。我發現這在一些Drupal的源代碼:

// Set return value for the service 
$return = array(); 
if ($method['#return']) { 
    **// Don't let a struct be declared as return parameter, because nusoap will not 
    // Send back anything.** 
    $return['return'] = 'xsd:'. $method['#return']; 
    if ($method['#return'] == 'struct' || $method['#return'] == 'array') { 
    $return['return'] = 'xsd:Array'; 
    } 
} 

希望這可以幫助別人誰努力解決同樣的問題。

+0

對返回值設置爲比特「XSD:數組」無論自定義的定義的ComplexType救了我!那麼,在NuSOAP追蹤這個* UnDocumented * bug約一週後。 – Kingsolmn 2012-01-11 22:42:18

+0

我沒有進入PHP。你把這些代碼放在哪裏? – 2013-10-07 11:15:07

相關問題