Neste artigo, estarei ensinando como desenvolver uma _production_ que acessa e retorna dados de um banco de dados externos.
Estarei usando o MySQL neste exemplo, porém a forma de conexão será a mesma para os demais bancos.
Farei a comunicação via REST e estarei utilizando o Postman para testar a produção de interoperabilidade.
**1. INTRODUÇÃO:**
* O primeiro passo é criar um namespace que seja habilitado para interoperabilidade, ou seja, que tenha esta caixinha selecionada:![](/sites/default/files/inline/images/images/image(4564).png) Neste namespace, iremos desenvolver as classes que vão implementar nossa production;
* Irei dividir o desenvolvimento em algumas partes:
* Desenvolvendo o Business Operation;
* Desenvolvendo o Business Service;
* Criando o aplicativo Web;
* Criando a Production;
**2. DESENVOLVENDO O BUSINESS OPERATION:**
* O Business Operation (BP) é a parte responsável pela conexão com os sistemas externos, no nosso caso, o MySQL;
* O BP é uma classe que estende a Ens.BusinessOperation. Ela chama os métodos que realizam as ações necessárias nos sistemas externos utilizando os adaptadores;</li>
Nossa classe vai ficar assim:
-
Ela sempre deve conter o Extends Ens.BusinessOperation;
-
O BO tem 3 classes para cada tipo de ação:
-
Request;
-
Response;
-
Method;
-
Cada ação tem uma requisição, faz as funções definidas na classe Method e devolve uma resposta, que iremos definir depois;
-
O parâmetro ADAPTER deve indicar qual adaptador iremos utilizar para a conexão com o sistema externo (no nosso caso, um adaptador SQL);
-
Lista de adaptadores do Iris: -> https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?KEY=SETAdapters
-
Devemos também definir uma propriedade Adapter para utilizar os métodos da classe do adaptador;
-
O parâmetros de invocação pode ser "Queue" ou "InProc";
-
Abaixo definimos o XData MessageMap que indica qual método a classe Operation deve executar:
-
Você define qual vai ser a requisição;
-
No nosso exemplo, queremos somente obter os dados do Banco de dados, então definimos que:
-
Quando a classe Operation receber uma requisição de obter objeto, ela deve mandar para o método "Exibir", definido dentro da classe Operation;
-
A classe BO será chamada por outras classes dentro da Production, como o BS ou o BP, por isso definimos os parâmetros que ela deve receber dessas outras classes:
-
No nosso caso, quando recebermos uma requisição para obter um objeto, o método Exibir será chamado;
-
O método exibir recebe uma requição e e devolve em Output uma resposta;
-
O método exibir retorna a execução do método Execute definido em Method de ObterObjeto (que recebe uma instância da classe operation, a requisição e devolve a resposta);
</ul>
2.1. DESENVOLVENDO AS CLASSES PARA OBTER OS DADOS DO BANCO:
-
Nosso BO deve ficar assim:
-
Cada ação contém 3 classes: Method, Request e Response. No nosso caso, só temos a ação ObterObjeto;
-
A classe Operation é responsável por chamar os métodos que realizam as ações (definimos no XData MessageMap);
-
Desenvolvendo a classe Request:
-
Dentro da production, a comunicação é feita através de requisições e responstas;
-
As requisições são recebidas de outas classes, por isso não é importante saber de onde vem por agora, somente sua implementação;
-
Cada ação tem necessidades específicas, por isso montamos a classe de requisição seguindo as necessidades:
-
Deve estender a Ens.Request;
-
Deve conter o parâmetro RESPONSECLASSNAME definido com o nome da classe resposta;
-
As outras propriedades dependem do que precisamos receber das demais classes para realizar o método da ação: no nosso caso, precisamos receber o ID do objeto no banco para realizarmos o SELECT, por isso temos a propriedade ID;
-
Desenvolvendo a classe Response:
-
Toda requisição tem uma resposta;
-
Cada ação deve ter uma resposta específica, por isso desenvolvemos essa classe segundo nossas necessidades:
-
No nosso caso, iremos retornar um objeto, por isso temos uma propriedade resultado que é um objeto:
-
Esse objeto deve conter as propriedades necessárias para armazenar os dados que queremos. Por exemplo, eu preciso armazenar os dados de um livro que irei resgatar do MySQL, então meu objeto vai ficar desse jeito:
-
Podeconter o %XML.Adaptor e o %JSON.Adaptor para podermos visualizar de outras formas;
-
Coloquei as propriedades Erro e ErroMessage que receberão os erros que tiver na execução de Method;
-
Os métodos abaixo são os que iremos utilizar para transformar as respostas em objetos dinâmicos para poder retorná-los;
-
Desenvolvendo a classe Method:
-
A classe Method vai executar a ação que desejamos. No nosso caso, acessar e recuperar valores do Banco de Dados:
-
No nosso caso, Method recebe a instância de Business Operation (para utilizarmos os métodos da sua propriedade Adapter), a requisição (para ter acesso ao ID e comparar no SELECT) e devolve Response;
-
Utilizando a propriedade Adapter para realizamos o SELECT, instanciamos um objeto da classe que criamos para receber esses dados e colocamos ele na propriedad Resultado de Response;
3 . DESENVOLVENDO O BUSINESS SERVICE:
-
A classe Business Service (BS) é responsável por receber a requisição de um sistema que deseja acessar a Production (no nosso caso, via REST);
-
A conexão também é feita via adaptadores;
-
Nossa BS vai ficar assim:
-
As classes BS devem sempre estender a Ens.BusinessService;</li>
-
Como iremos utilizar REST, deve estender a %CSP.REST;
-
As outras definições são todas do REST;
-
No método exibir, iremos receber o ID do livro que desejamos buscar no banco e começar sua execução:
-
Primeiro instanciar um objeto de Requisição de ObterObjeto;
-
Adicionar o parâmetro em sua propriedade;
-
Depois chamamos o método GetService que definimos abaixo: