Bagaimana saya mengkonsumsi data JSON melalui panggilan balik hook_menu?

9

Saya mencoba menyiapkan WebAPI Tropo dengan situs Drupal, dan saya pikir saya hanya akan membuat panggilan balik hook_menu () misalnya.com/tropo, kemudian gunakan panggilan balik hook_menu yang baru saja saya buat untuk menggunakan panggilan API dari Tropo ( yang berisi array data JSON sederhana), lalu merespons.

Saya dapat melakukan bagian respons dengan cukup mudah ... membangun data, drupal_json_output () dan keluar (yang pada dasarnya mengembalikan JSON).

Bagian yang saya mengalami masalah adalah mendapatkan data yang dikirim ke menu / panggilan balik menu tropo ... Saya tidak dapat mengakses data apa pun dengan menggunakan salah satu dari berikut ini:

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

(di bawah ini menggunakan modul inputstream :)

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

Saya memeriksa apa yang dilakukan beberapa modul lain, dan sepertinya mereka menggunakan hook_init untuk mengambil JSON. Apakah ini metode yang disukai? Saya ingin bisa melakukannya di hook_menu dan menggunakan jalur saya sendiri dan semacamnya ...

Atau, apakah saya lebih baik menulis skrip PHP saya sendiri dan menjalankan di luar Drupal, hanya melakukan bootstrap untuk database jika saya perlu?

geerlingguy
sumber
Data mana yang akan mendapatkan panggilan balik menu, dan apa yang meneruskan data itu ke panggilan balik menu (server eksternal, atau yang lainnya)? Bisakah Anda mengontrol format data?
kiamlaluno
Dari: php.net/manual/en/wrappers.php.php : "php: // input memungkinkan Anda membaca data mentah dari badan permintaan. Dalam kasus permintaan POST, itu lebih disukai untuk $ HTTP_RAW_POST_DATA karena tidak bergantung pada arahan khusus php.ini. Selain itu, untuk kasus-kasus di mana $ HTTP_RAW_POST_DATA tidak terisi secara default, ini merupakan alternatif yang berpotensi kurang intensif memori untuk mengaktifkan always_populate_raw_post_data. php: // input tidak tersedia dengan enctype = "multipart / form-data" . " Apakah itu mungkin relevan bagi Anda?
Berdir
Saya sudah mencoba php: // input, tetapi sepertinya tidak mendapatkan apa-apa. Ketika saya menggunakan inputstream, drupal: // input mengembalikan '1' :(
geerlingguy
@kiamlaluno - Saya mencoba untuk mendapatkan data yang diposting ke URL / tropo dari server Tropo; mereka mengirimkan beberapa JSON yang berisi nomor telepon penelepon, dan saya perlu menanggapinya. Tapi saya tidak bisa mendapatkan di JSON, jadi saya tidak bisa mendapatkan di nomor telepon :(
geerlingguy

Jawaban:

2

Ya, ternyata saya sudah mendapatkan datanya, tapi saya lupa mendekodekannya ...

Dalam panggilan balik hook_menu saya:

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

Kemudian saya bisa bermain sebanyak yang saya mau dengan nilai $ accept.

Selain itu, modul inputstream sangat berharga dalam membiarkan saya masuk ke input stream lebih dari sekali (jika Anda mencoba menggunakan php://inputlebih dari sekali, yang kedua kali, dan yang mengikuti, akan mengembalikan NULL).

Sebagai catatan tambahan, saya baru melihat hari ini modul baru yang mungkin cara yang lebih sederhana untuk menangani ini: Konten sebagai JSON

geerlingguy
sumber
4
Dua tahun kemudian, dan pencarian Google saya mengembalikan saya ke lingkaran penuh.
geerlingguy
Bagaimana Anda menangani otentikasi siapa yang membuat permintaan (mengirim JSON) dalam situasi ini?
sheldonkreger
Berikut ini penjelasan lebih lanjut tentang solusi yang disajikan di atas. wunderkraut.com/blog/…
sheldonkreger
2

Server REST yang merupakan bagian dari modul Layanan melakukan ini secara otomatis untuk JSON dan juga untuk format lain: http://drupal.org/project/services

Ini juga mendukung Inputstream (Inputstream dibangun untuk menangani verifikasi OAuth dan decoding Layanan dari aliran yang sama).

VoxPelli
sumber