如何使用Drupal返回实际的JSON?

时间:2011-11-03 17:49:28

标签: ajax json drupal drupal-7

我想在本地实现一个简单的AJAX函数,允许我在用户输入时自动完成现有节点的节点标题。为此,我需要能够拥有可以在节点标题上搜索的API。问题是当我输出原始JSON时,它被标签包围。所以,无论我做什么,我都会继续......

<html>
    <head>
    </head>
    <body>
        <pre style="word-wrap: break-word; white-space: pre-wrap;"> {json here}</pre>
    </body>
</html>

我已经尝试实现一个只能输出内容的自定义页面模板,它会产生相同的结果。以下是我目前在模块文件中执行此操作的方法......

<?php

/**
 * Implementation of hook_menu()
 */
function content_relation_menu() {
    $items = array();
    $items['api'] = array(
        'title' => 'Search',
        'page callback' => 'content_relation_get',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );

    return $items;
}

function content_relation_get($term = '') {
    drupal_add_http_header('Content-Type', 'application/javascript; utf-8');
    $var = json_encode(
        db_query("SELECT nid,title FROM {node} WHERE title LIKE :title LIMIT 5", array(":title" => $term.'%'))->fetchAll()
    );
    echo $var;
    exit(0);
}

如何返回JUST raw JSON?

3 个答案:

答案 0 :(得分:9)

'Drupal'方式正在使用drupal_json_output()drupal_exit()

$data = db_query("SELECT nid,title FROM {node} WHERE title LIKE :title LIMIT 5", array(":title" => $term.'%'))->fetchAll();

drupal_json_output($data);

drupal_exit();

<强>更新

我只是把你的代码放到一个模块中,而我在请求http://site.com/api时获得的是预期的JSON,没有标签。这个问题与Drupal无关,更可能与服务器/浏览器配置有关。

此链接可能有所帮助:

What do browsers want for the Content-Type header on json ajax responses?

答案 1 :(得分:2)

这实际上是DID输出原始JSON - Chrome正在添加html包装。在命令行cURL中查看输出显示这确实输出了原始JSON。

答案 2 :(得分:0)

取出口(0);它应该工作。如果您的页面回调没有返回任何内容,则不会调用普通主题处理程序,因此您将获得原始输出。

也就是说,由于Drupal的性能相当差,为了获得不错的响应时间,你最好制作一个与drupal DB对话的小型独立脚本,这样你就不会支付drupal的相当沉重的启动成本当您不需要该功能时请求。