ฉันจะใช้ข้อมูล JSON ผ่านการติดต่อกลับของ hook_menu ได้อย่างไร


9

ฉันกำลังพยายามตั้งค่า WebAPI ของ Tropo ด้วยเว็บไซต์ Drupal และฉันคิดว่าฉันเพิ่งสร้างการติดต่อกลับ hook_menu () สำหรับ example.com/tropo จากนั้นใช้การโทรกลับ hook_menu ที่ฉันเพิ่งสร้างขึ้นเพื่อใช้การโทร API จาก Tropo ( ซึ่งมีอาร์เรย์ข้อมูล JSON อย่างง่าย) จากนั้นตอบกลับ

ฉันสามารถทำส่วนการตอบสนองได้อย่างง่ายดาย ... สร้างข้อมูล drupal_json_output () และ exit (นั่นแค่คืนค่า JSON โดยทั่วไป)

ส่วนที่ฉันมีปัญหาคือการรับข้อมูลที่ส่งไปยังการเรียกกลับเมนู / tropo ... ฉันไม่สามารถเข้าถึงข้อมูลใด ๆ โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้:

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

(ด้านล่างใช้โมดูลอินพุตสตรีม :)

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

ฉันตรวจสอบสิ่งที่โมดูลอื่นทำและดูเหมือนว่าพวกเขาใช้ hook_init เพื่อคว้า JSON นี่เป็นวิธีที่ต้องการหรือไม่ ฉันชอบที่จะสามารถทำได้ใน hook_menu และใช้เส้นทางของตัวเองและเช่น ...

หรือฉันจะดีกว่าถ้าเขียนสคริปต์ PHP ของตัวเองและทำงานนอก Drupal เพียงทำ bootstrap สำหรับฐานข้อมูลถ้าฉันต้องการ?


ข้อมูลใดที่เมนูเรียกกลับรับและสิ่งที่ส่งผ่านข้อมูลเหล่านั้นไปยังเมนูติดต่อกลับ (เซิร์ฟเวอร์ภายนอกหรืออย่างอื่น) คุณสามารถควบคุมรูปแบบข้อมูลได้หรือไม่?
kiamlaluno

จาก: php.net/manual/en/wrappers.php.php : "อินพุต php: // ช่วยให้คุณสามารถอ่านข้อมูลดิบจากเนื้อความคำขอในกรณีที่คำขอ POST จะดีกว่า $ HTTP_RAW_POST_DATA เนื่องจากไม่ได้ขึ้นอยู่กับ คำสั่งพิเศษ php.ini นอกจากนี้สำหรับกรณีที่ไม่มีการเติม $ HTTP_RAW_POST_DATA ตามค่าเริ่มต้นมันเป็นทางเลือกที่ไม่ต้องใช้หน่วยความจำมากนักในการเปิดใช้งาน ." นั่นอาจเกี่ยวข้องกับคุณ
Berdir

ฉันได้ลองใช้ php: // input แล้ว แต่ดูเหมือนจะไม่ได้อะไรเลย เมื่อฉันใช้อินพุต
สตรีม

@kiamlaluno - ฉันพยายามรับข้อมูลที่โพสต์ไปยัง URL / tropo จากเซิร์ฟเวอร์ Tropo; พวกเขาส่ง JSON ที่มีหมายเลขโทรศัพท์ของผู้โทรมาและฉันจำเป็นต้องตอบกลับ แต่ฉันไม่สามารถรับที่ JSON ดังนั้นฉันจึงไม่สามารถรับที่หมายเลขโทรศัพท์ :(
geerlingguy

คำตอบ:


2

มันกลับกลายเป็นว่าฉันได้รับข้อมูล แต่ฉันลืมที่จะถอดรหัส ...

ในการโทรกลับ hook_menu ของฉัน:

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

จากนั้นฉันสามารถเล่นได้มากเท่าที่ฉันต้องการด้วยมูลค่า $ ที่ได้รับ

นอกจากนี้InputStreamโมดูลเป็นสิ่งล้ำค่าในการให้ฉันได้รับการสตรีมใส่ได้มากกว่าหนึ่งครั้ง (ถ้าคุณลองใช้php://inputมากกว่าหนึ่งครั้งเป็นครั้งที่สองและต่อไปนี้นั้นจะกลับมาเป็นโมฆะ)

ในฐานะที่เป็นบันทึกเพิ่มเติมฉันเพิ่งสังเกตเห็นในวันนี้โมดูลใหม่ที่อาจเป็นวิธีที่ง่ายยิ่งขึ้นในการจัดการนี้: เนื้อหาเป็น JSON


4
สองปีต่อมาและการค้นหาของ Google ของฉันทำให้ฉันกลับมาเป็นวงกลม
geerlingguy

คุณจัดการกับการรับรองความถูกต้องของผู้ที่ทำการร้องขอ (ส่ง JSON) ในสถานการณ์นี้ได้อย่างไร?
sheldonkreger

นี่คือคำอธิบายเพิ่มเติมเล็กน้อยของโซลูชันที่นำเสนอข้างต้น wunderkraut.com/blog/…
sheldonkreger

2

เซิร์ฟเวอร์ REST ที่เป็นส่วนหนึ่งของโมดูลบริการจะทำสิ่งนี้โดยอัตโนมัติสำหรับ JSON เช่นเดียวกับรูปแบบอื่น ๆ : http://drupal.org/project/services

นอกจากนี้ยังรองรับอินพุตสตรีมมิ่ง (อินพุตสตรีมถูกสร้างขึ้นเพื่อรองรับการตรวจสอบ OAuth และการถอดรหัสบริการของสตรีมเดียวกัน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.