我想使用nuSOAP v 1.114在PHP Web服务中返回一个文章对象数组。这就是我设置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'
);
我的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标头后没有数据。
但是,如果我手动创建ARRAY OF ARRAYS,请执行以下操作:
$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几天。
答案 0 :(得分:5)
我修复了这个错误。对于任何感兴趣的人来说,这似乎是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';
}
}
希望这有助于其他遇到同样问题的人。
答案 1 :(得分:0)
以下是客户端和服务器的示例,了解如何使用php Web服务返回数组。这是一个很容易理解的例子 http://my-source-codes.blogspot.com/2011/10/php-web-service-return-array.html