2009-09-22 10 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の記事のクラスは非常に単純です:

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

それは動作します! ArticleTypeオブジェクトを正しくシリアル化することはできませんが、同じプロパティ( "articleId"、 "heading"、 "text")を持つ連想配列を正しくシリアル化することができないArrayOfArticleType WSDLの説明は何が間違っていますか?

すべてのコードは申し訳ありませんが、間違いを見つけ出す必要があると私は見落としています。私はこのサービスのWSDLを数日間設定することに苦労してきました。

答えて

4

このエラーは修正されました。関心のある人にとっては、これはNuSOAPのバグだと思われます。正しいWSDLが 'tns:ArrayOfArticleType'として構成されていても、関数のreturnTypeをxsd:Arrayとして登録する必要があります。私はいくつかの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のこの*文書化されていないバグを追いかけてから約1週間後。 – Kingsolmn

+0

私はPHPを使用していません。あなたはそのコードをどこに置いていますか? –

関連する問題