我正在使用漂亮的Restler REST框架将数据库中的一些资源暴露给各种客户端。
现在当从服务返回结果时,格式有点像这样(我在这里使用Restler网站自己的例子作为基础):
[
{
"id": 1,
"name": "Jac Wright",
"email": "jacwright@gmail.com"
}
]
或者用XML:
<?xml version="1.0"?>
<response>
<item>
<id>1</id>
<name>Jac Wright</name>
<email>jacwright@gmail.com</email>
<item>
</response>
有什么问题我在JSON中结构是匿名的(如果这是在这里使用的正确术语?)而在XML中,对象被包装在“item”标签中。我想看到返回的结构由资源类型名称包装。像这样:
[
"author": {
"id": 1,
"name": "Jac Wright",
"email": "jacwright@gmail.com"
}
]
和
<?xml version="1.0"?>
<response>
<author>
<id>1</id>
<name>Jac Wright</name>
<email>jacwright@gmail.com</email>
<author>
</response>
如果我还没有完全了解相关代码,那么在没有修改Restler本身的情况下这是否可行?
答案 0 :(得分:3)
example you have pointed out 会返回以下内容
return array(
array('id'=>1, 'name'=>'Jac Wright', 'email'=>'jacwright@gmail.com'),
array('id'=>2, 'name'=>'Arul Kumaran', 'email'=>'arul@luracast.com' ),
);
我们需要做的就是将各个数组包装在“author”键下的另一个数组中。例如,在author.php
<?php
class Author {
function post ($request_data){
print_r($request_data);
return $request_data;
}
function get() {
return array('author'=> array(
array('id'=>1, 'name'=>'Jac Wright1', 'email'=>'jacwright@gmail.com'),
array('id'=>2, 'name'=>'Arul Kumaran3','email'=>'arul@luracast.com')
));
}
}
这可以获得 json 和 xml
所需的确切结果author.xml:
<?xml version="1.0"?>
<response>
<author>
<id>1</id>
<name>Jac Wright1</name>
<email>jacwright@gmail.com</email>
</author>
<author>
<id>2</id>
<name>Arul Kumaran3</name>
<email>arul@luracast.com</email>
</author>
</response>
author.json:
{
"author": [
{
"id": 1,
"name": "Jac Wright1",
"email": "jacwright@gmail.com"
},
{
"id": 2,
"name": "Arul Kumaran3",
"email": "arul@luracast.com"
}
]
}
让我解释一下我使用的技术,我使用了上面的post方法并发布了我想要的确切xml
结构,并使用print_r
来查找相应的php
结构: )
这是我在命令行中尝试过的cURL
curl -X POST http://restler2.dev/test/naming_returned/author.xml -H "Content-Type: text/xml" -d '<response><author><id>1</id><name>Jac Wright</name><email>jacwright@gmail.com</email></author><author><id>1</id><name>Jac Wright</name><email>jacwright@gmail.com</email></author></response>'
和回复
Array
(
[author] => Array
(
[0] => Array
(
[id] => 1
[name] => Jac Wright
[email] => jacwright@gmail.com
)
[1] => Array
(
[id] => 1
[name] => Jac Wright
[email] => jacwright@gmail.com
)
)
)
<?xml version="1.0"?>
<response>
<author>
<id>1</id>
<name>Jac Wright</name>
<email>jacwright@gmail.com</email>
</author>
<author>
<id>1</id>
<name>Jac Wright</name>
<email>jacwright@gmail.com</email>
</author>
</response>
为了完整性,让我把网关index.php
放在这里
<?php
require_once '../../restler/restler.php';
#set autoloader
#do not use spl_autoload_register with out parameter
#it will disable the autoloading of formats
spl_autoload_register('spl_autoload');
$r = new Restler();
$r->addAPIClass('Author');
$r->setSupportedFormats('JsonFormat','XmlFormat');
$r->handle();