¿Cómo consumo datos JSON a través de una devolución de llamada hook_menu?

9

Estoy tratando de configurar WebAPI de Tropo con un sitio Drupal, y pensé en crear una devolución de llamada hook_menu () por ejemplo.com/tropo, luego usar la devolución de llamada hook_menu que acabo de crear para consumir la llamada API de Tropo ( que contiene una simple matriz de datos JSON), luego responda.

Puedo hacer la parte de respuesta con bastante facilidad ... construir los datos, drupal_json_output () y salir (eso solo devuelve el JSON básicamente).

La parte con la que tengo problemas es para obtener los datos que se envían a la devolución de llamada del menú / tropo ... No puedo acceder a ningún dato utilizando cualquiera de los siguientes:

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

(a continuación utiliza el módulo inputstream :)

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

Verifiqué lo que hacen otros módulos, y parece que usan hook_init para tomar el JSON. ¿Es este el método preferido? Me encantaría poder hacerlo en hook_menu y usar mi propio camino y tal ...

Alternativamente, ¿sería mejor escribir mi propio script PHP y ejecutarlo fuera de Drupal, simplemente haciendo un arranque para la base de datos si es necesario?

geerlingguy
fuente
¿Qué datos obtendría la devolución de llamada del menú y qué está pasando esos datos a la devolución de llamada del menú (un servidor externo u otra cosa)? ¿Puedes controlar el formato de datos?
kiamlaluno
De: php.net/manual/en/wrappers.php.php : "php: // input le permite leer datos sin procesar del cuerpo de la solicitud. En caso de solicitudes POST, es preferible a $ HTTP_RAW_POST_DATA ya que no depende de directivas especiales de php.ini. Además, para aquellos casos en los que $ HTTP_RAW_POST_DATA no se rellena de forma predeterminada, es una alternativa potencialmente menos intensiva en memoria para activar always_populate_raw_post_data. php: // input no está disponible con enctype = "multipart / form-data" ". ¿Es eso relevante para ti?
Berdir
He intentado php: // input, pero eso parece no obtener nada. Cuando estoy usando inputstream, drupal: // input devuelve '1' :(
geerlingguy
@kiamlaluno: estoy tratando de publicar los datos en la URL / tropo desde los servidores de Tropo; envían algunos JSON que contienen el número de teléfono de la persona que llama, y ​​necesito responder. Pero no puedo acceder al JSON, así que no puedo acceder al número de teléfono :(
geerlingguy

Respuestas:

2

Bueno, resulta que estaba obteniendo los datos, pero olvidé decodificarlos ...

En mi devolución de llamada hook_menu:

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

Entonces puedo jugar todo lo que quisiera con el valor $ recibido.

Además, el flujo de entrada del módulo es muy valiosa para dejar a llegar al flujo de entrada más de una vez (si se intenta usar php://inputmás de una vez, la segunda vez, y los siguientes, devolverá NULL).

Como nota adicional, acabo de notar hoy un nuevo módulo que podría ser una forma aún más simple de manejar esto: Contenido como JSON

geerlingguy
fuente
44
Dos años después, y mis búsquedas en Google me devuelven el círculo completo.
geerlingguy
¿Cómo maneja la autenticación de quién está haciendo la solicitud (enviando el JSON) en esta situación?
sheldonkreger
Aquí hay un poco más de explicación de la solución presentada anteriormente. wunderkraut.com/blog/…
sheldonkreger
2

El servidor REST que forma parte del módulo Servicios lo hace automáticamente para JSON y para otros formatos: http://drupal.org/project/services

También es compatible con Inputstream (Inputstream se creó para manejar tanto la verificación OAuth como la decodificación de servicios de la misma secuencia).

VoxPelli
fuente