Jak korzystać z danych JSON poprzez wywołanie zwrotne hook_menu?

9

Próbuję skonfigurować WebAPI Tropo z witryną Drupal i pomyślałem, że po prostu utworzę wywołanie zwrotne hook_menu () na przykład.com/tropo, a następnie użyję wywołania zwrotnego hook_menu, które właśnie utworzyłem, aby wykorzystać wywołanie API z Tropo ( który zawiera prostą tablicę danych JSON), a następnie odpowiedz.

Mogę dość łatwo wykonać część odpowiedzi ... zbudować dane, drupal_json_output () i wyjść (to po prostu zwraca JSON).

Problem z tym, że mam problemy z uzyskaniem danych wysyłanych do wywołania zwrotnego menu / tropo ... Nie mogę uzyskać dostępu do żadnych danych, używając jednej z następujących czynności:

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

(poniżej używa modułu inputstream :)

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

Sprawdziłem, co robią niektóre inne moduły i wygląda na to, że używają hook_init, aby pobrać JSON. Czy to preferowana metoda? Chciałbym móc to zrobić w hook_menu i użyć własnej ścieżki i tak dalej ...

Alternatywnie, czy lepiej byłoby napisać własny skrypt PHP i uruchomić poza Drupalem, po prostu robiąc bootstrap dla bazy danych, jeśli zajdzie taka potrzeba?

geerlingguy
źródło
Jakie dane otrzyma wywołanie zwrotne menu i co przekazuje te dane do wywołania zwrotnego menu (serwer zewnętrzny lub coś innego)? Czy potrafisz kontrolować format danych?
kiamlaluno
From: php.net/manual/en/wrappers.php.php : "dane wejściowe php: // pozwalają na odczytanie surowych danych z treści żądania. W przypadku żądań POST preferowane jest $ HTTP_RAW_POST_DATA, ponieważ nie zależy od specjalne dyrektywy php.ini. Ponadto w przypadkach, w których $ HTTP_RAW_POST_DATA nie jest domyślnie zapełniany, jest to potencjalnie mniej wymagająca pamięć alternatywna do aktywacji always_populate_raw_post_data. php: // wejście nie jest dostępne z enctype = "multipart / form-data" . ” Czy to może być dla ciebie istotne?
Berdir
Próbowałem wejść php: //, ale wydaje się, że nic nie dostaje. Gdy używam inputstream, drupal: // input zwraca „1” :(
geerlingguy
@kiamlaluno - Próbuję pobrać dane na adres URL / tropo z serwerów Tropo; przesyłają JSON zawierający numer telefonu osoby dzwoniącej i muszę na nie odpowiedzieć. Ale nie mogę dostać się do JSON, więc nie mogę dostać się pod numer telefonu :(
geerlingguy

Odpowiedzi:

2

Okazuje się, że otrzymywałem dane, ale zapomniałem je zdekodować ...

W moim wywołaniu zwrotnym hook_menu:

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

Wtedy mogę grać tyle, ile bym chciał z otrzymaną wartością $.

Ponadto moduł strumienia wejściowego jest nieoceniony , ponieważ pozwala mi dotrzeć do strumienia wejściowego więcej niż jeden raz (jeśli spróbujesz użyć php://inputwięcej niż raz, drugi raz, a kolejne, zwrócą NULL).

Jako dodatkową notatkę właśnie zauważyłem dzisiaj nowy moduł, który może być jeszcze prostszym sposobem radzenia sobie z tym: Treść jako JSON

geerlingguy
źródło
4
Dwa lata później moje wyszukiwania w Google przywracają mnie do życia.
geerlingguy,
Jak radzisz sobie z uwierzytelnianiem, kto wysyła żądanie (wysyłając JSON) w tej sytuacji?
sheldonkreger
Oto nieco więcej wyjaśnienia rozwiązania przedstawionego powyżej. wunderkraut.com/blog/…
sheldonkreger
2

Serwer REST, który jest częścią modułu Usługi, robi to automatycznie dla JSON, a także dla innych formatów: http://drupal.org/project/services

Obsługuje również Inputstream (Inputstream został zbudowany do obsługi zarówno weryfikacji OAuth, jak i dekodowania usług tego samego strumienia).

VoxPelli
źródło