Как использовать данные JSON с помощью обратного вызова hook_menu?

9

Я пытаюсь настроить WebAPI Tropo с сайтом Drupal, и я подумал, что просто создам обратный вызов hook_menu () для example.com/tropo, а затем использую обратный вызов hook_menu, который я только что создал, чтобы использовать вызов API из Tropo ( который содержит простой массив данных JSON), а затем ответить.

Я могу довольно легко выполнить ответную часть ... собрать данные, drupal_json_output () и выйти (это просто возвращает JSON в основном).

У меня возникли проблемы с получением данных, которые отправляются в обратный вызов меню / tropo ... Я не могу получить доступ к каким-либо данным, используя одно из следующих действий:

$json = file_get_contents("php://input"); // returns NULL

(ниже используется модуль inputtream :)

$json = file_get_contents("drupal://input"); // also returns NULL

Я проверил, что делают некоторые другие модули, и похоже, что они используют hook_init для захвата JSON. Это предпочтительный метод? Я хотел бы иметь возможность сделать это в hook_menu и использовать свой собственный путь и тому подобное ...

В качестве альтернативы, лучше ли мне писать свой собственный PHP-скрипт и запускать за пределами Drupal, просто делая загрузку для базы данных, если мне это нужно?

geerlingguy
источник
Какие данные получит обратный вызов меню, и что передает эти данные обратному вызову меню (внешний сервер или что-то еще)? Вы можете контролировать формат данных?
kiamlaluno
From: php.net/manual/en/wrappers.php.php : "php: // input позволяет читать необработанные данные из тела запроса. В случае запросов POST предпочтительнее $ HTTP_RAW_POST_DATA, так как он не зависит от специальные директивы php.ini.Кроме того, для тех случаев, когда $ HTTP_RAW_POST_DATA не заполняется по умолчанию, это потенциально менее ресурсоемкая альтернатива активации Always_populate_raw_post_data. php: // ввод недоступен с enctype = "multipart / form-data" «. Это может иметь отношение к вам?
Бердир
Я пробовал ввод php: //, но, похоже, ничего не получилось. Когда я использую inputtream, drupal: // input возвращает '1' :(
geerlingguy
@kiamlaluno - я пытаюсь получить данные, размещенные на URL / tropo с серверов Tropo; они представляют JSON, содержащий номер телефона звонящего, и мне нужно ответить на него. Но я не могу получить в JSON, поэтому я не могу получить по номеру телефона :(
geerlingguy

Ответы:

2

Оказывается, я получаю данные, но я забыл их расшифровать ...

В моем обратном вызове hook_menu:

$received = file_get_contents("drupal://input"); // Use inputstream module.
$received = json_decode($received, TRUE);

Тогда я могу играть столько, сколько я хотел бы с полученным значением $.

Кроме того, модуль inputtream имеет неоценимое значение, так как позволяет мне входить во входной поток более одного раза (если вы попытаетесь использовать php://inputболее одного раза, второй раз и последующие вызовет NULL).

Как дополнительное примечание, я только что заметил сегодня новый модуль, который может быть еще более простым способом обработки этого: Контент как JSON

geerlingguy
источник
4
Два года спустя, и мои поиски в Google вернули меня на круги своя.
geerlingguy
Как вы обрабатываете аутентификацию того, кто делает запрос (отправляет JSON) в этой ситуации?
Шелдонкрегер
Вот немного больше объяснения решения, представленного выше. wunderkraut.com/blog/...
sheldonkreger
2

Сервер REST, являющийся частью модуля Services, делает это автоматически для JSON, а также для других форматов: http://drupal.org/project/services

Он также поддерживает Inputstream (Inputstream был создан для обработки как проверки OAuth, так и декодирования служб одного и того же потока).

VoxPelli
источник