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

From: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をアクティブにする代わりに、メモリをあまり消費しない可能性があります。enctype= "multipart / form-data"ではphp:// inputは使用できません」それはおそらくあなたに関係がありますか?
Berdir

私はphp:// inputを試しましたが、何も得られないようです。inputstreamを使用しているとき、drupal:// inputは '1'を返します:(
geerlingguy

@kiamlaluno-TropoサーバーからURL / tropoに投稿されたデータを取得しようとしています。彼らは発信者の電話番号を含むいくつかのJSONを送信し、私はそれに応答する必要があります。しかし、JSONを取得できないため、電話番号を取得できません:(
geerlingguy

回答:


2

ええと、データを取得していたことがわかりましたが、デコードするのを忘れていました...

私のhook_menuコールバックでは:

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

その後、$ received値を好きなだけ再生できます。

さらに、inputstreamモジュールは、入力ストリームに複数回アクセスできるようにするために非常に重要です(php://input複数回使用しようとすると、2回目以降はNULLを返します)。

追加のメモとして、私は今日、これを処理するさらに簡単な方法である可能性がある新しいモジュールに気づきました:Content as JSON


4
2年後、私のグーグル検索は私を完全に取り戻しました。
geerlingguy 2013

この状況で誰が要求を行っているか(JSONを送信している)の認証をどのように処理しますか?
sheldonkreger 14

上記の解決策についてもう少し説明します。wunderkraut.com/blog/...
sheldonkreger

2

サービスモジュールの一部であるRESTサーバーは、JSONおよび他の形式の場合、これを自動的に行います。http//drupal.org/project/services

また、Inputstreamもサポートします(Inputstreamは、同じストリームのOAuth検証とサービスデコードの両方を処理するために構築されました)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.