如何通过hook_menu回调使用JSON数据?


9

我试图通过Drupal站点设置Tropo的WebAPI,我想我只是为example.com/tropo创建一个hook_menu()回调,然后使用我刚创建的hook_menu回调来消耗Tropo的API调用(其中包含一个简单的JSON数据数组),然后响应。

我可以很轻松地完成响应部分...构建数据,drupal_json_output()并退出(基本上只是返回JSON)。

我遇到问题的部分是获取发送到/ tropo菜单回调的数据...我无法使用以下两种方法之一来访问任何数据:

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

(下面使用inputstream模块:)

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

我检查了其他一些模块的功能,看起来它们使用hook_init来获取JSON。这是首选方法吗?我很希望能够在hook_menu中使用自己的路径,例如...

另外,如果需要的话,我会写自己的PHP脚本并在Drupal之外运行,还是对数据库进行引导,这会更好吗?


菜单回调将获得哪些数据,以及将那些数据传递给菜单回调(外部服务器或其他)的原因是什么?您可以控制数据格式吗?
kiamlaluno

来自:php.net/manual/en/wrappers.php.php:“ php:// input允许您从请求正文中读取原始数据。在POST请求的情况下,它比$ HTTP_RAW_POST_DATA更可取,因为它不依赖于特殊的php.ini指令。此外,对于默认情况下不填充$ HTTP_RAW_POST_DATA的那些情况,它可能是比调用always_populate_raw_post_data更少的内存密集型。php:// input不适用于enctype =“ multipart / form-data” ”。这可能与您有关吗?
Berdir 2011年

我已经尝试了php:// input,但这似乎什么也没有。当我使用inputstream时,drupal:// input返回'1':(
geerlingguy

@kiamlaluno-我正试图将数据从Tropo服务器发布到URL / tropo;他们提交了一些包含呼叫者电话号码的JSON,我需要对其进行响应。但是我无法获取JSON,因此无法获取电话号码:(
geerlingguy

Answers:


2

好吧,事实证明我正在获取数据,但是我忘了对其进行解码...

在我的hook_menu回调中:

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

然后,我可以使用$ received值尽可能多地玩游戏。

另外,inputstream模块在让我多次访问输入流方面具有无价的价值(如果您尝试使用php://input多次,则第二次,以及随后的那些将返回NULL)。

另外,我今天注意到一个新模块,它可能是处理此问题的更简单方法:内容为JSON


4
两年后,我的Google搜索使我回到了整个圈子。
geerlingguy

在这种情况下,您如何处理谁在发出请求(发送JSON)的身份验证?
sheldonkreger 2014年

这里是上述解决方案的更多解释。wunderkraut.com/blog/...
sheldonkreger

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.