Comment puis-je consommer des données JSON via un rappel hook_menu?

9

J'essaie de configurer WebAPI de Tropo avec un site Drupal, et je pensais que je créerais simplement un rappel hook_menu () pour example.com/tropo, puis utiliser le rappel hook_menu que je viens de créer pour consommer l'appel d'API de Tropo ( qui contient un simple tableau JSON de données), puis répondez.

Je peux faire la partie réponse assez facilement ... construire les données, drupal_json_output () et quitter (qui retourne simplement le JSON fondamentalement).

La partie avec laquelle je rencontre des problèmes est d'obtenir les données envoyées au rappel du menu / tropo ... Je ne peux accéder à aucune donnée en utilisant l'une des méthodes suivantes:

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

(ci-dessous utilise le module inputstream :)

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

J'ai vérifié ce que font certains autres modules, et il semble qu'ils utilisent hook_init pour récupérer le JSON. Est-ce la méthode préférée? J'adorerais pouvoir le faire dans hook_menu et utiliser mon propre chemin et autres ...

Sinon, serais-je mieux d'écrire mon propre script PHP et de courir en dehors de Drupal, en faisant juste un bootstrap pour la base de données si j'en ai besoin?

geerlingguy
la source
Quelles données le rappel de menu obtiendrait-il et qu'est-ce qui transmet ces données au rappel de menu (un serveur externe ou autre)? Pouvez-vous contrôler le format des données?
kiamlaluno
De: php.net/manual/en/wrappers.php.php : "php: // input vous permet de lire les données brutes du corps de la requête. En cas de requêtes POST, il est préférable de $ HTTP_RAW_POST_DATA car cela ne dépend pas de directives php.ini spéciales. De plus, dans les cas où $ HTTP_RAW_POST_DATA n'est pas renseigné par défaut, c'est une alternative potentiellement moins gourmande en mémoire que l'activation de always_populate_raw_post_data. php: // l'entrée n'est pas disponible avec enctype = "multipart / form-data" . " Est-ce que cela vous concerne peut-être?
Berdir
J'ai essayé l'entrée php: //, mais cela ne semble rien. Lorsque j'utilise inputstream, drupal: // input renvoie '1' :(
geerlingguy
@kiamlaluno - J'essaie d'obtenir les données publiées sur l'URL / tropo à partir des serveurs Tropo; ils soumettent un JSON contenant le numéro de téléphone de l'appelant, et je dois y répondre. Mais je ne peux pas accéder au JSON, donc je ne peux pas obtenir le numéro de téléphone :(
geerlingguy

Réponses:

2

Eh bien, il s'avère que j'obtenais les données, mais j'ai oublié de les décoder ...

Dans mon rappel hook_menu:

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

Ensuite, je peux jouer autant que je le voudrais avec la valeur reçue en $.

En outre, le inputstream module est précieux pour me laisser obtenir au courant d'entrée plus d'une fois (si vous essayez d' utiliser php://inputplus d'une fois, la deuxième fois, et ceux qui suivent, retournera NULL).

Comme note supplémentaire, je viens de remarquer aujourd'hui un nouveau module qui pourrait être un moyen encore plus simple de gérer cela: le contenu en JSON

geerlingguy
la source
4
Deux ans plus tard, et mes recherches sur Google me ramènent à la boucle.
geerlingguy
Comment gérez-vous l'authentification de la personne qui fait la demande (envoi du JSON) dans cette situation?
sheldonkreger
Voici un peu plus d'explications sur la solution présentée ci-dessus. wunderkraut.com/blog/…
sheldonkreger
2

Le serveur REST qui fait partie du module Services le fait automatiquement pour JSON ainsi que pour d'autres formats: http://drupal.org/project/services

Il prend également en charge Inputstream (Inputstream a été conçu pour gérer à la fois la vérification OAuth et le décodage des services du même flux).

VoxPelli
la source