Como consumir dados JSON por meio de um retorno de chamada hook_menu?

9

Estou tentando configurar a WebAPI do Tropo com um site Drupal e pensei em criar um retorno de chamada hook_menu () por exemplo.com/tropo, depois usar o retorno de chamada hook_menu que acabei de criar para consumir a chamada API do Tropo ( que contém uma matriz de dados JSON simples) e responda.

Eu posso fazer a parte da resposta com bastante facilidade ... compilar os dados, drupal_json_output () e exit (que retorna o JSON basicamente).

A parte com a qual estou tendo problemas é obter os dados enviados para o retorno de chamada do menu / tropo ... Não consigo acessar nenhum dado usando um dos seguintes procedimentos:

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

(abaixo usa o módulo inputstream :)

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

Eu verifiquei o que alguns outros módulos fazem e parece que eles usam hook_init para pegar o JSON. Esse é o método preferido? Eu adoraria poder fazê-lo no hook_menu e usar meu próprio caminho e tal ...

Como alternativa, seria melhor escrever meu próprio script PHP e executar fora do Drupal, apenas fazendo uma inicialização para o banco de dados, se necessário?

geerlingguy
fonte
Quais dados o retorno de chamada do menu obteria e o que está passando esses dados para o retorno de menu (um servidor externo ou outra coisa)? Você pode controlar o formato dos dados?
kiamlaluno
From: php.net/manual/en/wrappers.php.php : "A entrada php: // permite ler dados brutos do corpo da solicitação. No caso de solicitações POST, é preferível a $ HTTP_RAW_POST_DATA, pois não depende de diretivas especiais do php.ini. Além disso, nos casos em que $ HTTP_RAW_POST_DATA não é preenchido por padrão, é uma alternativa potencialmente menos intensiva em memória para ativar always_populate_raw_post_data. php: // a entrada não está disponível com enctype = "multipart / form-data" . " Talvez isso seja relevante para você?
Berdir 6/06/11
Eu tentei php: // input, mas isso parece não conseguir nada. Quando estou usando inputstream, drupal: // input retorna '1' :(
geerlingguy
@kiamlaluno - Estou tentando obter os dados postados no URL / tropo dos servidores Tropo; eles enviam algum JSON contendo o número de telefone de um chamador e preciso responder a ele. Mas eu não posso chegar à JSON, então eu não posso chegar ao número de telefone :(
geerlingguy

Respostas:

2

Acontece que eu estava obtendo os dados, mas esqueci de decodificá-los ...

No meu retorno de chamada hook_menu:

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

Então eu posso brincar o quanto quiser com o valor recebido $.

Além disso, o inputstream módulo é inestimável em deixar-me chegar ao fluxo de entrada mais de uma vez (se você tentar usar php://inputmais de uma vez, pela segunda vez, e aqueles seguinte, irá retornar NULL).

Como uma observação adicional, observei hoje um novo módulo que pode ser uma maneira ainda mais simples de lidar com isso: Conteúdo como JSON

geerlingguy
fonte
4
Dois anos depois, e minhas pesquisas no Google me trazem um círculo completo.
precisa saber é o seguinte
Como você lida com a autenticação de quem está fazendo a solicitação (enviando o JSON) nessa situação?
sheldonkreger
Aqui está um pouco mais de explicação da solução apresentada acima. wunderkraut.com/blog/…
sheldonkreger
2

O servidor REST que faz parte do módulo Services faz isso automaticamente para JSON e para outros formatos: http://drupal.org/project/services

Ele também suporta o Inputstream (o Inputstream foi criado para lidar com a verificação do OAuth e a decodificação de serviços do mesmo fluxo).

VoxPelli
fonte