Làm cách nào để sử dụng dữ liệu JSON thông qua một cuộc gọi lại hook_menu?


9

Tôi đang cố gắng thiết lập WebAPI của Tropo với một trang web Drupal và tôi nghĩ rằng tôi chỉ cần tạo một cuộc gọi lại hook_menu () cho ví dụ.com / tropo, sau đó sử dụng hàm gọi lại hook_menu mà tôi vừa tạo để sử dụng lệnh gọi API từ Tropo ( trong đó chứa một mảng dữ liệu JSON đơn giản), sau đó trả lời.

Tôi có thể thực hiện phần trả lời khá dễ dàng ... xây dựng dữ liệu, drupal_jsonDefput () và thoát (về cơ bản chỉ trả về JSON).

Phần tôi gặp sự cố là nhận dữ liệu được gửi đến cuộc gọi lại menu / tropo ... Tôi không thể truy cập bất kỳ dữ liệu nào bằng cách sử dụng một trong các cách sau:

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

(bên dưới sử dụng mô-đun đầu vào :)

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

Tôi đã kiểm tra những gì một số mô-đun khác làm và có vẻ như chúng sử dụng hook_init để lấy JSON. Đây có phải là phương pháp ưa thích? Tôi rất thích có thể làm điều đó trong hook_menu và sử dụng đường dẫn của riêng tôi và ...

Ngoài ra, tôi có nên viết kịch bản PHP của riêng mình và chạy bên ngoài Drupal hay không, chỉ cần thực hiện bootstrap cho cơ sở dữ liệu nếu tôi cần?


Dữ liệu nào mà menu gọi lại sẽ nhận được, và những gì đang truyền những dữ liệu đó đến gọi lại menu (một máy chủ bên ngoài, hoặc một cái gì khác)? Bạn có thể kiểm soát định dạng dữ liệu?
kiamlaluno

Từ: php.net/manual/en/wrappers.php.php : "php: // input cho phép bạn đọc dữ liệu thô từ thân yêu cầu. Trong trường hợp yêu cầu POST, nó thích hợp hơn với $ HTTP_RAW_POST_DATA vì nó không phụ thuộc vào Ngoài ra, đối với các trường hợp trong đó $ HTTP_RAW_POST_DATA không được điền theo mặc định, đây là một giải pháp thay thế ít bộ nhớ hơn để kích hoạt always_population_raw_post_data. php: // input không khả dụng với enctype = "Multipart / form-data" . " Điều đó có thể liên quan đến bạn?
Berdir

Tôi đã thử php: // input, nhưng dường như không nhận được gì. Khi tôi đang sử dụng dòng đầu vào, drupal: // input trả về '1' :(
geummingguy

@kiamlaluno - Tôi đang cố gắng lấy dữ liệu được đăng lên URL / tropo từ các máy chủ của Tropo; họ gửi một số JSON chứa số điện thoại của người gọi và tôi cần phản hồi lại. Nhưng tôi không thể nhận được tại JSON, vì vậy tôi không thể nhận được số điện thoại :(
ge Muffguy

Câu trả lời:


2

Chà, hóa ra tôi đang lấy dữ liệu, nhưng tôi quên giải mã nó ...

Trong cuộc gọi lại hook_menu của tôi:

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

Sau đó, tôi có thể chơi xung quanh nhiều như tôi muốn với giá trị $ nhận được.

Thêm vào đó, inputstream Module này là vô giá trong việc để tôi có được vào dòng đầu vào nhiều hơn một lần (nếu bạn thử sử dụng php://inputnhiều hơn một lần, lần thứ hai, và những người sau đây, sẽ trở lại NULL).

Như một lưu ý bổ sung, hôm nay tôi mới nhận thấy một mô-đun mới có thể là cách xử lý đơn giản hơn nữa: Nội dung dưới dạng JSON


4
Hai năm sau, và các tìm kiếm Google của tôi đưa tôi trở lại vòng tròn đầy đủ.
ge Muffguy

Làm thế nào để bạn xử lý xác thực ai đang thực hiện yêu cầu (gửi JSON) trong tình huống này?
sheldonkreger

Dưới đây là một chút giải thích về giải pháp được trình bày ở trên. wunderkraut.com/blog/ từ
sheldonkreger 23/12/14

2

Máy chủ REST là một phần của mô-đun Dịch vụ tự động thực hiện điều này cho JSON cũng như cho các định dạng khác: http://drupal.org/project/service

Nó cũng hỗ trợ Đầu vào (Đầu vào được xây dựng để xử lý cả xác minh OAuth và giải mã Dịch vụ của cùng một luồng).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.