我想在本地实现一个简单的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?
答案 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的相当沉重的启动成本当您不需要该功能时请求。