Luracast Restler:“命名”返回对象

时间:2011-10-20 13:24:31

标签: php api rest

我正在使用漂亮的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本身的情况下这是否可行?

1 个答案:

答案 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();