Как я могу вернуть фактический JSON, используя Drupal? - PullRequest
7 голосов
/ 03 ноября 2011

Я хотел бы реализовать простую функцию AJAX локально, которая позволяет мне автоматически заполнять заголовки уже существующих узлов по мере ввода пользователем.Для этого мне нужна возможность иметь API для поиска по заголовкам узлов.Проблема заключается в том, что когда я выводлю сырой JSON, он окружен тегами.Поэтому, что бы я ни делал, я продолжаю получать ...

<code><html>
    <head>
    </head>
    <body>
        <pre style="word-wrap: break-word; white-space: pre-wrap;"> {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);
}

Как я могу вернуть JUST raw JSON?

Ответы [ 3 ]

9 голосов
/ 03 ноября 2011

В способе 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();

UPDATE

Я просто поместил ваш код, как есть, в модуль, и все, что я получаю при запросе http://site.com/api, это ожидаемый JSON, тэгов нет. Проблема не будет иметь ничего общего с Drupal, скорее с конфигурацией сервера / браузера.

Эта ссылка может помочь:

Что требуется браузерам для заголовка Content-Type в ответах json ajax?

2 голосов
/ 03 ноября 2011

Это на самом деле DID выводит необработанный JSON - Chrome добавляет html-обертку.Просмотр выходных данных в командной строке cURL показал, что при этом выводился необработанный JSON.

0 голосов
/ 03 ноября 2011

Снять выход (0); и это должно работать. Если обратный вызов вашей страницы ничего не возвращает, тогда обычные обработчики тем не вызываются, поэтому вы получаете необработанный вывод.

Тем не менее, из-за довольно низкой производительности Drupal, для достойного времени отклика вам лучше создать небольшой автономный скрипт, который взаимодействует с БД drupal, так что вы не платите довольно большие затраты на запуск drupal. запрашивать, когда вам не нужны эти функции.

...