2009-09-22 5 views
8

Tôi muốn trả về một mảng đối tượng bài viết trong một dịch vụ web PHP, sử dụng nuSOAP v 1.114. Đây là cách để tôi thiết lập các WSDL:Trả về một mảng đối tượng trong dịch vụ web PHP

$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' 
); 

My PHP Điều lớp là rất đơn giản:

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

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

Nếu tôi trở lại chỉ là một Điều new Object, như thế này:

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

chức năng, đã đăng ký là:

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

hoạt động tốt và trả về bài viết như thể nó là một mảng. Tuy nhiên, nếu tôi thử và trả về một ArrayOfArticleType (dòng nhận xét trong TestArrayReturn()), và đăng ký hàm như kiểu trả về tns: ArrayOfArticleType, thì nó không thành công với Lỗi: Lỗi HTTP: không có dữ liệu nào xuất hiện sau tiêu đề HTTP.

Tuy nhiên, nếu tôi có thể tạo một mảng của mảng bằng tay, như vậy:

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

nó hoạt động !? Điều gì là sai với mô tả WSDL ArrayOfArticleType của tôi mà không cho phép nó sắp xếp chính xác các đối tượng ArticleType, nhưng tuần tự đúng một mảng kết hợp với các thuộc tính giống nhau ("articleId", "heading", "text") ??

Xin lỗi vì tất cả mã, nhưng tôi cảm thấy cần thiết để xác định lỗi tôi đang xem. Bất kỳ trợ giúp được đánh giá cao, tôi đã đấu tranh với việc thiết lập WSDL cho dịch vụ này trong nhiều ngày.

Trả lời

4

Tôi đã khắc phục lỗi này. Đối với bất cứ ai quan tâm, điều này có vẻ là một lỗi trong NuSOAP. Bạn PHẢI đăng ký returnType của bạn cho hàm như xsd: Mảng cho nó trả về đúng mảng, mặc dù WSDL chính xác sẽ cấu thành nó là 'tns: ArrayOfArticleType'. Tôi tìm thấy điều này trong một số mã nguồn 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'; 
    } 
} 

Hy vọng điều này sẽ giúp người khác gặp khó khăn với cùng một vấn đề.

+0

Các chút thông tin về thiết lập các giá trị trả về để 'xsd: Array' không phụ thuộc vào tùy chỉnh định nghĩa ComplexType đã cứu tôi! Vâng, sau khoảng một tuần đuổi theo lỗi * Không được Tài liệu này trong NuSOAP. – Kingsolmn

+0

Tôi không tham gia PHP. Bạn đặt mã đó ở đâu? –