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
rest_client.php
DispositivoService
Model: ArquivosDisponiveis
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
- <?php
- // initialization script
- require_once 'init.php';
- class AdiantiRestServer
- {
- public static function run($request)
- {
- $class = isset($request['class']) ? $request['class'] : '';
- $method = isset($request['method']) ? $request['method'] : '';
- $response = NULL;
- // aqui implementar mecanismo de controle !!
- if (!in_array($class, array('DispositivoService')))
- {
- return json_encode( array('status' => 'error',
- 'data' => _t('Permission denied')));
- }
- try
- {
- if (class_exists($class))
- {
- if (method_exists($class, $method))
- {
- $rf = new ReflectionMethod($class, $method);
- if ($rf->isStatic())
- {
- $response = call_user_func(array($class, $method), $request);
- }
- else
- {
- $response = call_user_func(array(new $class($request), $method), $request);
- }
- return json_encode( array('status' => 'success', 'data' => $response));
- }
- else
- {
- $error_message = TAdiantiCoreTranslator::translate('Method ^1 not found', "$class::$method");
- return json_encode( array('status' => 'error', 'data' => $error_message));
- }
- }
- else
- {
- $error_message = TAdiantiCoreTranslator::translate('Class ^1 not found', $class);
- return json_encode( array('status' => 'error', 'data' => $error_message));
- }
- }
- catch (Exception $e)
- {
- return json_encode( array('status' => 'error', 'data' => $e->getMessage()));
- }
- }
- }
- print AdiantiRestServer::run($_REQUEST);
- ?>
rest_client.php
- <?php
- $location = 'http://localhost/GestaoMedia/rest.php';
- $parameters = array();
- $parameters['class'] = 'DispositivoService';
- $parameters['method'] = 'getArquivos';
- $parameters['chave'] = 'c22c60349630d688cef20a3fd708ad87';
- $url = $location . '?' . http_build_query($parameters);
- var_dump( json_decode( file_get_contents($url) ) );
- ?>
DispositivoService
- <?php
- class DispositivoService
- {
- /**
- * Retorna uma relação de arquivos que devem ser visualizadas no dispositivo
- * @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
- */
- public static function getArquivos( $chave )
- {
- TTransaction::open('GestaoMedia');
- $response = array();
- // define o critério
- $criteria = new TCriteria;
- $criteria->add(new TFilter('chave', '=', $chave));
- // carrega os arquivos
- $all = ArquivosDisponiveis::getObjects( $criteria );
- foreach ($all as $arquivo)
- {
- $response[] = $arquivo->toArray();
- }
- TTransaction::close();
- return $response;
- }
- }
- ?>
Model: ArquivosDisponiveis
- <?php
- /**
- * ArquivosDisponiveis Active Record
- * @author <your-name-here>
- */
- class ArquivosDisponiveis extends TRecord
- {
- const TABLENAME = 'v_arquivos';
- const PRIMARYKEY= 'id_dispositivo';
- const IDPOLICY = 'serial'; // {max, serial}
- /**
- * Constructor method
- */
- public function __construct($id = NULL, $callObjectLoad = TRUE)
- {
- parent::__construct($id, $callObjectLoad);
- parent::addAttribute('nomeDispositivo');
- parent::addAttribute('nomeArquivo');
- parent::addAttribute('chave');
- }
- }
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:
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!
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!
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
Ative o Log pra ver os SQL que estão sendo gerados, pra ver si tem algo estranho neles