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

Ajax 如何使用Drupal返回实际的JSON?,ajax,json,drupal,drupal-7,Ajax,Json,Drupal,Drupal 7,我想在本地实现一个简单的AJAX函数,它允许我根据用户类型自动完成现有节点的节点标题。为此,我需要能够有一个API,我可以搜索节点标题。问题是,当我输出原始JSON时,它被标记包围。所以,无论我做什么,我总是 <html> <head> </head> <body> <pre style="word-wrap: break-word; white-space: pre-wrap;"> {json

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

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

{json here}
我尝试过实现一个自定义页面模板,它只输出已经生成的内容,并产生相同的结果。以下是我目前如何在我的模块文件中执行此操作

<?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);
}
取出出口(0);它应该会起作用。如果您的页面回调没有返回任何内容,则不会调用正常的主题处理程序,从而获得原始输出

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

Drupal的方式是使用和

更新

我刚刚将您的代码按原样放入一个模块中,在请求
http://site.com/api
是预期的JSON,没有标记。问题与Drupal无关,更可能与服务器/浏览器配置有关

此链接可能有助于:


这确实输出了原始JSON-Chrome添加了html包装。在命令行cURL中查看输出显示,它确实输出了原始JSON。

这种方式“更正确”,但事实证明它确实输出了原始JSON。不过谢谢你。你抢先了我,我刚刚更新了我的答案,大意是:)在解决问题时敲CMS可能会让你明白,即使这是真的中间路线可能是仅通过调用drupal_bootstrap(drupal_bootstrap_database)将drupal引导到数据库级别,并避免所有沉重的模块开销;因此,它将HTML和PRE标记添加到JSON输出中,这令人困惑。查看源代码,您将看到那里没有标记。评论不错。这的确是一个非常有用的问题,而且可以节省时间!这可以帮助您自己在drupal中设置web服务(当您不需要像服务这样的重量级模块时),只需使用hook_菜单和回调。
$data = db_query("SELECT nid,title FROM {node} WHERE title LIKE :title LIMIT 5", array(":title" => $term.'%'))->fetchAll();

drupal_json_output($data);

drupal_exit();