Як я можу споживати дані JSON за допомогою зворотного дзвінка hok_menu?


9

Я намагаюся налаштувати WebAPI Tropo з веб-сайту Drupal, і я подумав, що просто створити зворотний виклик hoke_menu () для example.com/tropo, а потім використати зворотний виклик kuk_menu, який я щойно створив, щоб споживати виклик API від Tropo ( який містить простий масив даних JSON), потім відповідайте.

Я можу зробити частину відповідей досить легко ... збирати дані, drupal_json_output () та виходити (що лише повертає JSON в основному).

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

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

(нижче використовується модуль вхідного потоку :)

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

Я перевірив, що роблять деякі інші модулі, і, схоже, вони використовують гачку_init, щоб захопити JSON. Це кращий метод? Я хотів би мати можливість це зробити в гачку_меню і використовувати свій власний шлях і таке ...

Як варіант, мені краще буде писати власний PHP-скрипт і працювати поза Drupal, просто робити завантажувальну систему для бази даних, якщо мені потрібно?


Які дані отримали б зворотний виклик меню, а які передають ці дані до зворотного виклику меню (зовнішній сервер чи щось інше)? Чи можете ви контролювати формат даних?
kiamlaluno

Від: php.net/manual/en/wrappers.php.php : "php: // вхід дозволяє читати необроблені дані з органу запиту. У випадку POST-запитів, бажано використовувати $ HTTP_RAW_POST_DATA, оскільки це не залежить від Спеціальні директиви php.ini. Більше того, для тих випадків, коли $ HTTP_RAW_POST_DATA не заповнюється за замовчуванням, це потенційно менш об'ємна пам'ять альтернатива активації always_populate_raw_post_data. php: // вхід недоступний enctype = "multipart / form-data" . " Це, можливо, стосується вас?
Бердір

Я спробував php: // input, але, здається, нічого не виходить. Коли я використовую inputstream, drupal: // input повертає '1' :(
geerlingguy

@kiamlaluno - я намагаюся отримати дані, розміщені в URL / tropo, із серверів Tropo; вони подають деякі JSON, що містять номер телефону абонента, і мені потрібно відповісти на нього. Але я не можу потрапити в JSON, тому не можу отримати номер телефону :(
geerlingguy

Відповіді:


2

Ну, виявляється, я отримував дані, але я забув їх розшифрувати ...

У моєму зворотному дзвоні

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

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

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

Як додаткову примітку, я щойно помітив сьогодні новий модуль, який може бути ще простішим способом вирішення цього питання: Вміст як JSON


4
Через два роки, і пошуки в Google повертають мене на повне коло.
geerlingguy

Як ви обробляєте автентифікацію того, хто подає запит (надсилає JSON) у цій ситуації?
sheldonkreger

Ось трохи більше пояснення рішення, представленого вище. wunderkraut.com/blog/…
sheldonkreger

2

Сервер REST, який є частиною модуля Services, робить це автоматично для JSON, а також для інших форматів: http://drupal.org/project/services

Він також підтримує Inputstream (Inputstream був створений для обробки як перевірки OAuth, так і декодування Служб одного потоку).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.