Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Fazer o Framework consumir webservice e não disponibilizar ws? Olá pessoal. Eu já sei como disponibilizar um serviço de webservice usando o Adianti Framework através da classe AdiantiRecordService . Isto é até relativamente fácil. Mas eu tenho uma duvida: Como faço para o Adianti Framework consumir web service? A API Contacts somente mostra como disponibilizar os recursos através do webservice. Mas não mostra como os formulár...
RC
Fazer o Framework consumir webservice e não disponibilizar ws?  
Olá pessoal.

Eu já sei como disponibilizar um serviço de webservice usando o Adianti Framework através da classe AdiantiRecordService . Isto é até relativamente fácil.

Mas eu tenho uma duvida: Como faço para o Adianti Framework consumir web service?

A API Contacts somente mostra como disponibilizar os recursos através do webservice. Mas não mostra como os formulários seriam preenchidos usando webservice

Por exemplo: Eu tenho no Adianti Framework uma classe de controle chamado ClientesForm, que é o formulário onde que QUERO carregar as informações de um determinado cliente buscando pelo id.

Como eu carrego esta informação usando webservice, neste caso restful?

Eu estou pensado em colocar a requisição no método, que AO INVÉS de eu buscar a informação usando as classes de modelos TRecord, faria uma requisição restfull e carregaria tudo no formulários.

Como eu disse: AO INVÉS de eu buscar a informação usando as classes de modelos TRecord....

  1. <?php
  2.     
  3.     public function onEdit($param)
  4.     {      
  5.         try
  6.         {
  7.             if (isset($param['key']))            
  8.             {        
  9.                 $key=$param['key'];                          
  10.                 TTransaction::open('sample');      
  11.                 $cliente = new Clientes($key);   
  12.                 $this->form->setData($cliente);                
  13.                 TTransaction::close();
  14.             }
  15.         }
  16.         catch (Exception $e// in case of exception
  17.         {
  18.             new TMessage('error'$e->getMessage());
  19.             TTransaction::rollback();
  20.         }
  21.     }
  22. ?>


... faria uma requisição restful e carregaria tudo no formulário, mais ou menos assim:


  1. <?php
  2.     public function onEdit($param)
  3.     {      
  4.            require_once 'request.php';
  5.          try
  6.          {
  7.             if (isset($param['key']))            
  8.             {        
  9.                      $key=$param['key']; 
  10.                       // load object by id
  11.                      $location 'http://webpedido/clientes/$key';
  12.                      $data request($location'GET') );
  13.                      $this->form->setData($cliente);        
  14.                 }
  15.            }
  16.            catch (Exception $e)
  17.           {
  18.                 echo 'Error: ' $e->getMessage();
  19.            }
  20.     }
  21. ?>


Ou seja, cada classe de controle teria seus método que fariam as reaquisições ao invés de usarem as classes TRecord.


Está certo a minha abordagem? Eu quero que o a minha aplicação adianti esteja somente servindo-se ou utilizando-se de requisição.

E como eu faria esta requisição?


Agradeço a atenção e pela ajuda.





Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (6)


JC

Saudações,

Excelente pergunta, acompanhando...
NR

Pesquise por classes "service". Acredito que seja uma boa opção para esse caso. Em resumo, você deixaria a comunicação com o webservice a cargo dessa nova classe. Nos seus controls você só faria a chamada à função correspondente do service para retornar os dados desejados. Ex:
  1. <?php
  2. if (isset($param['key']))            
  3. {        
  4.      $key=$param['key']; 
  5.       // load object by id
  6.      $cliente NomeService::getCliente($key);
  7.      $this->form->setData($cliente); // se o retorno da funcao for um objeto e o nome dos atributos corresponder ao nome dos campos do formulário, você pode passá-lo diretamente para a funcao setData
  8. }
  9. ?>
RC

Olá Nataniel Rabaioli, muito obrigado pela resposta, eu conheço as classes service, mas o que o pessoal da empresa que eu trabalho quer é que sejam duas aplicações diferente baseadas no Adianti Framework...

Em um servidor colocaremos somente o Adianti Framework (template) com as classes de controle tipo ClientesForm, ClientesList com os métodos fazendo as requisições para OUTRO servidor onde tbm estará o Adianti Framework mas desta vez SOMENTE com as classes Service e as classe de Modelo TRecord, que serão usadas pelas classes Service.

O primeiro servidor fará as requisições para o segundo servidor. Então usar as classes service para preencher os formulário não será possível.

A maneira como você sugeriu eu pensei em fazer isto, usando as classes service, mas dai o Adianti Framework não estaria consumindo webservice entende e o pessoal da minha empresa não aceitou isto, entende?

Eu preciso que os formulários sejam preenchidos usando as requisições para outro servidor de webservice. E não usando diretamente as classes service. Já que teremos OUTRAS instalações do Adianti Framework ( com classes de controle tipo ClientesForm, ClientesList ) em servidores diferentes fazendo as requisições ( ou consumindo webservice) para um mesmo servidor onde terá o Adianti Framework (com as classes services e de modelo TRecord.)

Pelo que eu vi, os exemplos que foram dados, tanto no livrocomo no na comunidade, somente mostram como fazer o Adianti Framework disponibilizar webservice mas não como Adianti Framework consumir webservice.

Será o Pablo pode responder aí pra nós. Eu acredito que a forma que eu sugeri estaria correto. Aguardo mais sugestões.

Acompanhando.....

NR

Renato, quando me referi a criar uma classe Service, foi no sentido geral, sem relação com as classes existentes. Nada impede que você crie um service para buscar dados de um webservice. Minha sugestão foi no sentido de isolar a lógica da comunicação em outra classe, para evitar ter que fazer isso em cada classe control.

Eu comunico com diversas APIs usando essa ideia, sempre criando uma ou mais classes Service para cada API.

Por exemplo, segue Service criado para buscar informações da API dos correios:
  1. <?php
  2. class CorreiosAPIService
  3. {
  4.     const API_INI 'app/config/correios.ini';
  5.     private static function executeWS($function$params)
  6.     {
  7.         try
  8.         {
  9.             $ini parse_ini_file(SELF::API_INI);
  10.             $client = new SoapClient($ini['server']);
  11.             $result $client->{$function}($params);
  12.             $result $result->return;
  13.             return self::transform($result);
  14.         }
  15.         catch(Exception $e)
  16.         {
  17.             throw $e;
  18.         }
  19.     }
  20.     private static function transform($result)
  21.     {
  22.         $transform = ['end' => 'rua'];
  23.         foreach ($transform as $key => $value)
  24.         {
  25.             if(isset($result->$key))
  26.             {
  27.                 $result->$value $result->$key;
  28.                 unset($result->$key);
  29.             }
  30.         }
  31.         if(isset($result->cidade) AND $result->cidade)
  32.         {
  33.             $cidade Cidade::getCidadeByNomeUF($result->cidade$result->uf);
  34.             if($cidade)
  35.             {
  36.                 $result->cidade_id $cidade->id;
  37.             }
  38.         }
  39.         return $result;
  40.     }
  41.     public static function buscaCEP($cep)
  42.     {
  43.         try
  44.         {
  45.             return self::executeWS('consultaCEP', ['cep' => $cep]);
  46.         }
  47.         catch(Exception $e)
  48.         {
  49.             return FALSE;
  50.         }
  51.     }
  52.     public static function validaCEP($cep)
  53.     {
  54.         $result self::buscaCEP($cep);
  55.         if($result)
  56.         {
  57.             return TRUE;
  58.         }
  59.         return FALSE;
  60.     }
  61. }
  62. ?>
RC

Olá Nataniel.

Agora entendi o que tu quis dizer, muito obrigado mesmo pela resposta.

E achei excelente a ideia de isolar as requisições nas classes service e assim retirar as requisições das classes de controle.

Uma ultima duvida, eu colocaria estas classes na pasta app/service?

Mas mais uma vez muito obrigado pela resposta.
IM

Tmb faço sempre isolando tudo em pastas dentro da pasta app/service
tenho classe de consumo de muitas coisas: nfe; cep; e uma busca em meu servidor Windows com sql server 2000;
-
Minhas respostas sempre em JSON ... manipulo essa resposta e preenche a grid com metodo onreload ... campo a campo (ja eh costume meu);
-
Adianti consume webservice como qualquer sistema em PHP normal;