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


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_dump( json_decode( file_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. // define o critério
  13. $criteria = new TCriteria;
  14. $criteria->add(new TFilter('chave', '=', $chave));
  15. // carrega os arquivos
  16. $all = ArquivosDisponiveis::getObjects( $criteria );
  17. foreach ($all as $arquivo)
  18. {
  19. $response[] = $arquivo->toArray();
  20. }
  21. TTransaction::close();
  22. return $response;
  23. }
  24. }
  25. ?>


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. * Constructor method
  13. */
  14. public function __construct($id = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct($id, $callObjectLoad);
  17. parent::addAttribute('nomeDispositivo');
  18. parent::addAttribute('nomeArquivo');
  19. parent::addAttribute('chave');
  20. }
  21. }

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework 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. // define o critério
  8. $criteria = new TCriteria;
  9. $criteria->add(new TFilter('chave', '=', $params['chave']));
  10. ?>
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. * Constructor method
  13. */
  14. public function __construct($id = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct($id, $callObjectLoad);
  17. parent::addAttribute('id_dispositivo');
  18. parent::addAttribute('nomeDispositivo');
  19. parent::addAttribute('nomeArquivo');
  20. parent::addAttribute('chave');
  21. }
  22. }
  23. ?>
WP

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