Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Web Services REST (Erro no retorno) Olá amigos, bom dia! Estou com dificuldade em encontrar e resolver um erro que recebo quando faço a requisição a um método em um WS que estou criando. Aparentemente segui todos os passos mas mesmo assim o WS não funciona. Estou recebendo o seguinte erro como retorno: C:wamp64wwwGestaoMediarest_client.php:8: object(stdClass)[1] public 'status' => string 'error' (length=...
GO
Web Services REST (Erro no retorno)  
Olá amigos, bom dia!

Estou com dificuldade em encontrar e resolver um erro que recebo quando faço a requisição a um método em um WS que estou criando.
Aparentemente segui todos os passos mas mesmo assim o WS não funciona.

Estou recebendo o seguinte erro como retorno:


C:wamp64wwwGestaoMediarest_client.php:8:
object(stdClass)[1]
public 'status' => string 'error' (length=5)
public 'data' => string 'SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)' (length=79)


Seguem os códigos em uso:

rest.php

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


rest_client.php

  1. <?php
  2. $location 'http://localhost/GestaoMedia/rest.php';
  3. $parameters = array();
  4. $parameters['class'] = 'DispositivoService';
  5. $parameters['method'] = 'getArquivos';
  6. $parameters['chave'] = 'c22c60349630d688cef20a3fd708ad87';
  7. $url $location '?' http_build_query($parameters);
  8. var_dumpjson_decodefile_get_contents($url) ) );
  9. ?>


DispositivoService

  1. <?php
  2. class DispositivoService
  3. {
  4.     /**
  5.      * Retorna uma relação de arquivos que devem ser visualizadas no dispositivo
  6.      * @param $chave é uma chave de segurança única a ser adicionada no aplicativo cliente para que o mesmo acesse as informações a serem exibidas
  7.      */
  8.     public static function getArquivos$chave )
  9.     {
  10.         TTransaction::open('GestaoMedia');
  11.         $response = array();
  12.         
  13.         // define o critério
  14.         $criteria = new TCriteria;
  15.         $criteria->add(new TFilter('chave''='$chave));
  16.         
  17.         // carrega os arquivos
  18.         
  19.         $all ArquivosDisponiveis::getObjects$criteria );
  20.         
  21.         
  22.         foreach ($all as $arquivo)
  23.         {
  24.             $response[] = $arquivo->toArray();
  25.         }
  26.         TTransaction::close();
  27.         return $response;
  28.     }
  29. }
  30. ?>


Model: ArquivosDisponiveis

  1. <?php
  2. /**
  3.  * ArquivosDisponiveis Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class ArquivosDisponiveis extends TRecord
  7. {
  8.     const TABLENAME 'v_arquivos';
  9.     const PRIMARYKEY'id_dispositivo';
  10.     const IDPOLICY =  'serial'// {max, serial}
  11.     
  12.     
  13.     /**
  14.      * Constructor method
  15.      */
  16.     public function __construct($id NULL$callObjectLoad TRUE)
  17.     {
  18.         parent::__construct($id$callObjectLoad);
  19.         parent::addAttribute('nomeDispositivo');
  20.         parent::addAttribute('nomeArquivo');
  21.         parent::addAttribute('chave');
  22.     }
  23. }

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 (5)


NR

Acredito que o problema esteja na sua função getArquivos. Você não consegue recuperar o parâmetro chave diretamente, pois ele é um array contendo todos os parâmetros da requisição:
  1. <?php
  2. // public static function getArquivos( $chave )
  3. public static function getArquivos$params )
  4. {
  5.         TTransaction::open('GestaoMedia');
  6.         $response = array();
  7.         
  8.         // define o critério
  9.         $criteria = new TCriteria;
  10.         $criteria->add(new TFilter('chave''='$params['chave']));
  11. ?>
MS

Seu modelo foi construído a partir do assistente de modelos?
Achei a linha "const PRIMARYKEY= 'id_dispositivo';" diferente da que o construtor gera como padrão!
GO

Olá Marcelo, boa tarde!
O Modelo foi feito pelo assistente mas não é o modelo de uma tabela no banco mas de uma view.
Nesse caso eu teria que criar um campo chamado id na view?

Vou realizar alguns testes aqui.
Obrigado pela observação!
GO

Olá!
Infelizmente continuo recebendo esse retorno:

C:wamp64wwwGestaoMediarest_client.php:8:
object(stdClass)[1]
public 'status' => string 'error' (length=5)
public 'data' => string 'SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)' (length=79)

Atualização da model

  1. <?php
  2. /**
  3.  * ArquivosDisponiveis Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class ArquivosDisponiveis extends TRecord
  7. {
  8.     const TABLENAME 'v_arquivos';
  9.     const PRIMARYKEY'id';
  10.     const IDPOLICY =  'serial'// {max, serial}
  11.     
  12.     
  13.     /**
  14.      * Constructor method
  15.      */
  16.     public function __construct($id NULL$callObjectLoad TRUE)
  17.     {
  18.         parent::__construct($id$callObjectLoad);
  19.         parent::addAttribute('id_dispositivo');
  20.         parent::addAttribute('nomeDispositivo');
  21.         parent::addAttribute('nomeArquivo');
  22.         parent::addAttribute('chave');
  23.     }
  24. }
  25. ?>
WP

Ative o Log pra ver os SQL que estão sendo gerados, pra ver si tem algo estranho neles