Inscrições abertas para nosso Webinar anual Adianti Framework 2024!
Clique aqui para saber mais
Consumir rest com json Olá pessoal, estou tentando fazer update usando rest.php com o method "store" em Data passando o ID, porém sempre inseri um registro vazio, ao invés de fazer a atualização do id informado. Json abiaxo: POST { "class" : "ClientesService", "method" : "store", "data": [{ "id": "7", "CLI_TIPO": "1", "CLI_NOME": "LOJA TESTE " }] } ...
RA
Consumir rest com json  
Olá pessoal, estou tentando fazer update usando rest.php com o method "store" em Data passando o ID, porém sempre inseri um registro vazio, ao invés de fazer a atualização do id informado. Json abiaxo:
POST
{ "class" : "ClientesService", "method" : "store", "data": [{ "id": "7", "CLI_TIPO": "1", "CLI_NOME": "LOJA TESTE " }] }

Retorno:
{ "status": "success", "data": { "id": 2497 } }


Repare que não atualizou o registro que informei no json, e criou um novo registro vazio na base de dados.

qual seria a forma correta de usar este serviço rest via Json?

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (12)


NR

Você está usando a função store da classe AdiantiRecordService ou a sobrescreveu? Pelo comportamento descrito, não está reconhecendo nenhum atributo passado em "data", senão eles também deveriam ser retornados na resposta. O nome dos atributos está correto? Você está usando a função request padrão(https://pastebin.com/jmXjD1pw) para envio das informações?
RA

Olá Nataniel Rabaioli, sim estou usando o AdiantiRecordService, a única coisa que alterei no próprio rest.php foi alterar a posição do parse do request pois não estava reconhecendo o envio com json.

class AdiantiRestServer { public static function run($request) { $input = json_decode(file_get_contents("php://input")); $request = array_merge($request, (array) $input); ///--> inserido aqui $class = isset($request['class']) ? $request['class'] : ''; $method = isset($request['method']) ? $request['method'] : ''; // $request = array_merge($request, (array) $input); //// comentado aqui $response = NULL; . .


Estou tentando consumir este serviço de outro aplicativo que não é PHP, por isso preciso enviar fazer o store em json puro e não esta dando certo, com method load e loadAll funcionou perfeitamente.

Obrigado pela atenção.
NR

É difícil dizer sem ver como os dados estão sendo enviados. Mas deve ser algum detalhe na passagem dos parâmetros. Tente debugar na função store os dados recebidos.
RA

Então Nataniel, neste teste de exemplo usei o postman, ou seja, enviando json puro com verbo POST e nao deu certo. Onde vejo um exemplo de envio para o method "store" via json ? Na documentação só encontrei exemplos via PHP dos modelos da próprio Adianti Studio.

obrigado !
NR

https://adianti.com.br/forum/pt/view_4691?servicos-rest-no-adianti-framework-7
RA

Nataniel, então o serviço rest do adianti só funciona com request via script php ? como eu consumo o serviço de outra linguagem ? pure json
NR

Não precisa ser em php. A função "request" do link acima, por exemplo, usa a curl para envio dos dados. A curl pode ser usada via linha de comando, inclusive.
RA

Entendi Nataniel. Mas não é isso que eu preciso. Se é padrão json deveria aceitar esse POST.

{
"class" : "ClientesService",
"method" : "store",
"data": [{
"id": "7",
"CLI_TIPO": "1",
"CLI_NOME": "LOJA TESTE "
}]
}
NR

O conteúdo de "data" deve ser um objeto simples, não um array:
"data": {
"id": "7",
....
}
RA

Nataniel, sem esse array aparece o erro abaixo:
Fatal error: Uncaught Error: Cannot use object of type stdClass as array in D:wampwwwgnotelibadiantidatabaseTRecord.php on line 320<

E com array faz o insert de um registro vazio
{
"status": "success",
"data": {
"id": 2496
}
}


Segue rest.php :

  1. <?php
  2. header('Content-Type: application/json; charset=utf-8');
  3. // initialization script
  4. require_once 'init.php';
  5. class AdiantiRestServer
  6. {
  7.     public static function run($request)
  8.     {
  9.         $input    json_decode(file_get_contents("php://input"));        
  10.         $request  array_merge($request, (array) $input);                
  11.         $class     = isset($request['class']) ? $request['class']   : '';
  12.         $method = isset($request['method']) ? $request['method']  :  ''
  13.  //       $request  = array_merge($request, (array) $input);
  14.         $response NULL;
  15.         
  16.             
  17. /*
  18.         // aqui implementar mecanismo de controle !!
  19.         if (get_parent_class($class) !== 'Adianti\Service\AdiantiRecordService')
  20.         {
  21.             return json_encode( array('status' => 'error',
  22.                                       'data'   => _t('Permission denied')));
  23.         }
  24. */        
  25.         try
  26.         {
  27.             if (class_exists($class))
  28.             {
  29.                 if (method_exists($class$method))
  30.                 {
  31.                     $rf = new ReflectionMethod($class$method);
  32.                     if ($rf->isStatic())
  33.                     {
  34.                         $response call_user_func(array($class$method), $request);
  35.                     }
  36.                     else
  37.                     {
  38.                         $response call_user_func(array(new $class($request), $method),$request);
  39.                     }
  40.                     return json_encode( array('status' => 'success''data' => $response));
  41.                 }
  42.                 else
  43.                 {
  44.                     $error_message AdiantiCoreTranslator::translate('Method ^1 not found'"$class::$method");
  45.                     return json_encode( array('status' => 'error''data' => $error_message));
  46.                 }
  47.             }
  48.             else
  49.             {
  50.                 $error_message AdiantiCoreTranslator::translate('Class ^1 not found'$class);
  51.                 return json_encode( array('status' => 'error''data' => $error_message));
  52.             }
  53.         }
  54.         catch (Exception $e)
  55.         {
  56.             return json_encode( array('status' => 'error''data' => $e->getMessage()));
  57.         }
  58.     }
  59. }
  60. print AdiantiRestServer::run($_REQUEST);
  61. ?>


NR

Acrescente "true" no segundo parâmetro da json_decode para forçar o cast para array associativo:
//$input = json_decode(file_get_contents("php://input"));
$input = json_decode(file_get_contents("php://input"), true);
RA

Nataniel, funcionou amigo... era só isso, agora consigo enviar update ou insert de outros sistemas, via postaman... etc... show de bola. Muitíssimo obrigado pela paciência e grato pela contribuição., seria bom atualizar isso nos exemplos aqui do forum.

POST:
{
"class" : "ClientesService",
"method" : "store",
"data": {
"id": "7",
"CLI_NOME": "TESTE VIA POSTMAN "
}
}

RETORNO:
{
"status": "success",
"data": {
"id": "7",
"CLI_NOME": "TESTE VIA POSTMAN "
}
}