Wie verwende ich JSON-Daten über einen Hook_menu-Rückruf?

9

Ich versuche, Tropos WebAPI mit einer Drupal-Site einzurichten, und dachte, ich würde einfach einen hook_menu () - Rückruf für example.com/tropo erstellen und dann den soeben erstellten hook_menu-Rückruf verwenden, um den API-Aufruf von Tropo ( die ein einfaches JSON-Array von Daten enthält), dann antworten.

Ich kann den Antwortteil ziemlich einfach erledigen ... die Daten erstellen, drupal_json_output () und beenden (das gibt im Grunde nur den JSON zurück).

Der Teil, mit dem ich Probleme habe, besteht darin, die Daten abzurufen, die an den Rückruf des Menüs / tropo gesendet werden. Ich kann mit keiner der folgenden Methoden auf Daten zugreifen:

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

(unten verwendet das Inputstream-Modul :)

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

Ich habe überprüft, was einige andere Module tun, und es sieht so aus, als würden sie hook_init verwenden, um den JSON abzurufen. Ist das die bevorzugte Methode? Ich würde es gerne in hook_menu tun und meinen eigenen Weg benutzen und so ...

Alternativ wäre es besser, wenn ich mein eigenes PHP-Skript schreibe und außerhalb von Drupal ausgeführt würde und nur einen Bootstrap für die Datenbank mache, wenn ich muss?

geerlingguy
quelle
Welche Daten würde der Menü-Rückruf erhalten und was überträgt diese Daten an den Menü-Rückruf (einen externen Server oder etwas anderes)? Können Sie das Datenformat steuern?
Kiamlaluno
Von: php.net/manual/en/wrappers.php.php : "Mit der Eingabe php: // können Sie Rohdaten aus dem Anforderungshauptteil lesen. Bei POST-Anforderungen ist dies $ HTTP_RAW_POST_DATA vorzuziehen, da dies nicht davon abhängt Spezielle php.ini-Direktiven. In Fällen, in denen $ HTTP_RAW_POST_DATA nicht standardmäßig ausgefüllt ist, ist dies eine möglicherweise weniger speicherintensive Alternative zur Aktivierung von always_populate_raw_post_data. php: // Eingabe ist mit enctype = "multipart / form-data" nicht verfügbar. . " Ist das vielleicht relevant für dich?
Berdir
Ich habe versucht, php: // Eingabe, aber das scheint nichts zu bekommen. Wenn ich Inputstream verwende, gibt drupal: // input '1' :(
geerlingguy
@kiamlaluno - Ich versuche, die Daten von den Tropo-Servern an die URL / tropo zu senden. Sie senden JSON mit der Telefonnummer eines Anrufers, und ich muss darauf antworten. Aber ich kann nicht an die JSON kommen, also kann ich nicht an die Telefonnummer kommen :(
geerlingguy

Antworten:

2

Nun, es stellte sich heraus, dass ich die Daten erhalten habe, aber ich habe vergessen, sie zu dekodieren ...

In meinem hook_menu Rückruf:

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

Dann kann ich mit dem erhaltenen Wert so viel herumspielen, wie ich möchte.

Darüber hinaus ist das Eingabestream- Modul von unschätzbarem Wert, damit ich mehr als einmal zum Eingabestream gelangen kann (wenn Sie versuchen, php://inputmehr als einmal zu verwenden, wird beim zweiten und den folgenden Mal NULL zurückgegeben).

Als zusätzliche Anmerkung habe ich heute ein neues Modul bemerkt, das eine noch einfachere Möglichkeit sein könnte, dies zu handhaben: Inhalt als JSON

geerlingguy
quelle
4
Zwei Jahre später und meine Google-Suche schließt den Kreis.
Geerlingguy
Wie gehen Sie in dieser Situation mit der Authentifizierung um, wer die Anforderung stellt (den JSON sendet)?
Sheldonkreger
Hier finden Sie eine ausführlichere Erläuterung der oben dargestellten Lösung. wunderkraut.com/blog/…
sheldonkreger
2

Der REST-Server, der Teil des Services-Moduls ist, führt dies automatisch für JSON sowie für andere Formate aus: http://drupal.org/project/services

Es unterstützt auch Inputstream (Inputstream wurde entwickelt, um sowohl die OAuth-Überprüfung als auch die Services-Decodierung desselben Streams zu handhaben).

VoxPelli
quelle