Come si consumano i dati JSON tramite un callback hook_menu?


9

Sto cercando di configurare WebAPI di Tropo con un sito Drupal e ho pensato di creare un callback hook_menu () per esempio.com/tropo, quindi utilizzare il callback hook_menu che ho appena creato per consumare la chiamata API da Tropo ( che contiene un semplice array di dati JSON), quindi rispondi.

Posso fare la parte di risposta abbastanza facilmente ... costruire i dati, drupal_json_output () ed uscire (che in pratica restituisce il JSON).

La parte con cui ho problemi è ottenere i dati che vengono inviati al callback del menu / tropo ... Non riesco ad accedere a nessun dato usando uno dei seguenti:

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

(di seguito utilizza il modulo inputstream :)

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

Ho verificato cosa fanno alcuni altri moduli e sembra che usino hook_init per afferrare il JSON. È questo il metodo preferito? Mi piacerebbe poterlo fare in hook_menu e usare il mio percorso e così ...

In alternativa, starei meglio scrivendo il mio script PHP ed eseguendolo al di fuori di Drupal, facendo un bootstrap per il database, se necessario?


Quali dati otterrebbero il callback del menu e cosa sta passando a quelli callback del menu (un server esterno o qualcos'altro)? Puoi controllare il formato dei dati?
kiamlaluno

Da: php.net/manual/en/wrappers.php.php : "php: // input ti permette di leggere i dati grezzi dal corpo della richiesta. In caso di richieste POST, è preferibile a $ HTTP_RAW_POST_DATA in quanto non dipende da direttive speciali php.ini Inoltre, per quei casi in cui $ HTTP_RAW_POST_DATA non è popolato di default, è un'alternativa potenzialmente meno intensiva della memoria all'attivazione di always_populate_raw_post_data. php: // input non è disponibile con enctype = "multipart / form-data" ". È forse pertinente per te?
Berdir,

Ho provato php: // input, ma sembra che non ottenga nulla. Quando sto usando inputstream, drupal: // input restituisce '1' :(
geerlingguy

@kiamlaluno - Sto cercando di ottenere i dati inviati all'URL / tropo dai server Tropo; inviano alcuni JSON contenenti il ​​numero di telefono di un chiamante e devo rispondergli. Ma non riesco ad accedere al JSON, quindi non riesco ad ottenere il numero di telefono :(
geerlingguy

Risposte:


2

Bene, ho scoperto che stavo ottenendo i dati, ma ho dimenticato di decodificarli ...

Nel mio callback hook_menu:

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

Quindi posso giocare tutto quello che vorrei con il valore $ ricevuto.

Inoltre, il modulo inputstream ha un valore inestimabile nel consentirmi di accedere al flusso di input più di una volta (se si tenta di utilizzare php://inputpiù di una volta, la seconda volta e quelle successive restituiranno NULL).

Come nota aggiuntiva, ho appena notato oggi un nuovo modulo che potrebbe essere un modo ancora più semplice di gestire questo: Contenuto come JSON


4
Due anni dopo, e le mie ricerche su Google mi riportano al punto di partenza.
geerlingguy,

Come gestite l'autenticazione di chi effettua la richiesta (invio di JSON) in questa situazione?
sheldonkreger,

Ecco un po 'più di spiegazione della soluzione presentata sopra. wunderkraut.com/blog/…
sheldonkreger il

2

Il server REST che fa parte del modulo Servizi lo fa automaticamente per JSON e per altri formati: http://drupal.org/project/services

Supporta inoltre Inputstream (Inputstream è stato creato per gestire sia la verifica OAuth sia la decodifica dei servizi dello stesso flusso).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.