当我执行Get请求时,我想知道如何在我的cakephp中返回Json?

时间:2011-07-04 14:35:40

标签: android web-services json cakephp

我是cakephp和json的新手。我最近用cakephp建立了一个休息服务。一切似乎都在起作用。当我使用下面的代码查询链接时,它存储在一个单独的文件中:

<?php

$request =  'http://localhost/tut_blog/posts/'; 
$response = file_get_contents($request);
echo $response;
?>

我在html中获得了返回,因为我以这种方式编写了我的视图文件。她是我的观点文件:index.ctp

<h2>View all posts</h2>

  <table>
    <tr>
    <th>Title</th>
    <th>Body</th>
     </tr>

<?php foreach($posts as $post):?> // met de functie foreach wordt er hier geloopt door de variable $posts die we eerder in de controller hadden aangemaakt en die alle waarden bezit van de query die we eerder hadden opgesteld.

<tr>
    <td><?php echo $post['Post']['title'];?></td> // de $posts array bevat 2 sleutels nr 1 = naam van de model, nr 2 = de naam van de veld in je tabel.
    <td><?php echo $post['Post']['body'];?></td>
</tr>

<?php endforeach; ?>
 </table>

我想知道如何获得相同的数据,然后在JSON输出中。 这是我的控制器文件:

 <?php 

class PostsController extends AppController{

var $name = 'Posts';

var $components = array('RequestHandler');

    function hello_world(){


    }


    function index(){


    $this->set('posts',$this->Post->find('all')); 

    }

    function view($id = NULL){ 


    $this->set('post',$this->Post->read(NULL, $id));

    }


}

&GT;

2 个答案:

答案 0 :(得分:0)

您可以在视图中使用Js helper的对象方法:

  

echo $ this-&gt; Js-&gt; object($ posts);

您可能还想使用AJAX布局来避免包含default.ctp布局中的所有HTML:

在您的控制器中:

$this->layout = 'ajax';

希望这有帮助!

答案 1 :(得分:0)

假设你想保留你的html版本,并且想要提供一个json版本,那么你需要做几件事。

1)确保传递扩展名,以便您可以执行http://localhost/tut_blog/posts/index.json。有http://book.cakephp.org/view/1239/The-Simple-Setup的信息(* .xml,* .json的想法相同),但实际上你将以下内容添加到app/config/routes.php

Router::parseExtensions();

2)创建一个返回json的视图。对于您的情况,您可以在app/views/posts/json/index.ctp处查看类似于以下内容的视图...

<?php
$object = array();

if (!empty($posts)) {
    $object = $posts;
}

$jsonObj = $this->Js->object($object);
echo $jsonObj;
?>

在上面的视图中,我留下了很多地方供你插入调试内容,但是一旦你开心(<?php echo $this->Js->object($posts); ?>),你可以写得更紧凑。

3)确保你有一个json布局(app/views/layouts/json/default.ctp):

<?php
echo $content_for_layout;
?>

这是你可以做的最简单的布局,虽然对于我的一个客户我们已经添加了更多的智能,以便我们可以有一个返回错误的标准方法:

<?php
if (isset($errorMessage)) {
    $errorMessageData['error'] = $errorMessage;
    echo $this->Js->object($errorMessageData);
} else {
    echo $content_for_layout;
}
?>

这样,如果请求的url以.json结尾,你将获得上面的视图,否则将使用默认的视图和布局(通常是html)。

4)您可能需要将Js助手添加到控制器,或者更好的是将app_controller.php添加到所有视图中。有可能你不需要添加它,因为CakePHP可能会根据布局自动包含它,但是在添加json输出之前我们已经在app_controller.php中有了Js帮助器,所以我无法确切地告诉你。