【问题标题】:How can I return actual JSON using Drupal?如何使用 Drupal 返回实际的 JSON?
【发布时间】:2011-11-03 17:49:28
【问题描述】:

我想在本地实现一个简单的 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 原始 JSON?

【问题讨论】:

  • 确实是一个非常有用的问题并且可以节省时间!这可以帮助您仅使用 hook_menu 和回调在 drupal 中自行设置 Web 服务(当您不需要像 services 这样的重量级模块时)。

标签: ajax json drupal drupal-7


【解决方案1】:

“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?

【讨论】:

  • 这种方式“更正确”,但事实证明这确实输出了原始 JS。不过谢谢。
  • 你打败了我,我刚刚更新了我的答案:)
【解决方案2】:

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

【讨论】:

  • Chrome 似乎对可以显示为网页的内容有非常严格的定义;因此它将 HTML 和 PRE 标记添加到您的 JSON 输出中,这令人困惑。查看源代码,您会看到那里没有标签。很好的评论。
【解决方案3】:

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

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

【讨论】:

  • 在解决问题的同时敲击 CMS 可能会让您明白这一点,即使这是真的。 ;) 中间道路可能是仅通过调用 drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE) 将 drupal 引导到数据库级别,并避免所有繁重的模块开销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 2021-05-10
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多