8

nuSOAP v 1.114を使用して、PHPWebサービスで記事オブジェクトの配列を返したい。これが私がWSDLを設定する方法です:

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

私のPHPArticleクラスは非常に単純です。

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

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

次のように、新しいArticleオブジェクトだけを返す場合:

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ヘッダーの後にデータがありませんで失敗します。

ただし、次のように、手動でARRAYのARRAYを作成する場合:

$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

2 に答える 2

5

このエラーを修正しました。興味のある人にとっては、これは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';
  }
} 

これが同じ問題に苦しんでいる他の誰かを助けることを願っています。

于 2009-09-22T14:29:57.093 に答える
0

これは、php Webサービスで配列を返す方法のクライアントとサーバーの両方の例です。http://my-source-codes.blogspot.com/2011/10/php-web-service-return-を理解するのは簡単な例です 。 array.html

于 2012-01-23T17:09:04.297 に答える