2009-09-22 4 views
8

nuSOAP v 1.114를 사용하여 PHP 웹 서비스에서 기사 객체 배열을 반환하고 싶습니다.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; 
} 
} 

나는이 같은, 단지 새로운 기사 개체 반환하는 경우 :

$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 기사 클래스는 매우 간단하다 : 이것은 내가 WSDL을 설정하는 방법입니다

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

잘 작동하고, 마치 Array 인 것처럼 기사를 반환합니다. 그러나 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로 등록해야합니다. 좀 드루팔 소스 코드에서 이걸 발견 :이 같은 문제로 고생 다른 사람 도움

// 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'; 
    } 
} 

희망을. '배열을 XSD'에 관계없이 사용자의 여기

+0

을 이해하기 쉽게 예입니다 예이다 정의 된 ComplexType이 나를 구했어! 음, NuSOAP에서 * Undocumented * 버그를 쫓는 일주일 후에. – Kingsolmn

+0

저는 PHP가 아닙니다. 이 코드는 어디에 두어야합니까? –