Camada de Serviços

Bem como o objetivo da camada de visualização, a camada de serviços também tem o propósito de trazer facilidades para o desenvolvimento de aplicações, tentando amenizar os problemas ocasionados por um desenvolvimento sem padrões definidos e no modo "go horse". Foi pensando nestes objetivos que surgiu o projeto COMMONS-BUSINESS, que contempla a camada de serviços e a camada de persistência.

A camada de serviços nada mais é do que uma adaptação do padrão de Restful Objects.  Ela é responsável por oferecer uma forma de comunicação entre as diferentes partes do plugin através de URI que são expostos como serviços.

O modelo de URI é baseado nas operações HTTP (POST, PUT, DELETE e GET). E tratando-se do padrão Restful a URI do serviço exposto tem uma estrutura diferente, mantendo, entretanto, sua estrutura base, conforme podemos ver a seguir:.

http://{host}:{port}/{context}/rest/shield/latest/domain/{object}/

Onde:

  
VariávelDescrição
{host}Define onde a aplicação esta rodando
{port}É a porta do host onde a aplicação esta rodando
{context}É o Servlet Context da aplicacao. Por exemplo, no crowd normalmente é /crowd
{object}É o objeto da camada de persistência. Ou seja, é a classe Java que representa para a aplicação a entidade de banco de dados

Operações suportadas

Conforme dito acima, a camada de serviços expõe serviços que podem ser acionados através de operações HTTP, são elas:

OperaçãoDescrição
DELETEÉ a forma utilizada para remover registros identificados através da URI.
GETÉ usado para buscar ou ler recursos do banco de dados. A representação desse recurso pode ser expostos em alguns formatos, bem como XML ou JSON.
POSTÉ utilizado geralmente para a criação de novos recursos.
PUTÉ geralmente utilizado para a atualização de recursos

Leia mais: HTTP Methods

A seguir, as mesmas serão exploradas, dando exemplos utilização através de arquitetura.

 

GET

Como já dito, o método GET é utilizado para resgatar recursos de uma origem de dados. No caso da arquitetura criada, essa operação pode ser feita de duas maneiras. A primeira é passando o ID do objeto a ser buscado e a segunda é passando uma condicional para buscar uma lista de um determinado objeto.

Estas duas maneiras serão abordadas a seguir:

Passando ID:

É a maneira simplificada de resgatar objetos através do serviço, onde será retornado um registro único caso o mesmo exista. Assim sendo, a forma de utilizar este serviço é através da URI base concatenando ela com o identificador único (ID) do objeto a ser resgatado. A camada de serviço interpretará a operação requisitada e realizará uma pesquisa utilizando o identificador passado retornando o referido objeto, caso ele exista. Abaixo podemos ver um exemplo:

URI: ~/{id}

 

Onde:

ParâmetroDescrição
companyEste é o objeto representativo do banco de dados. Ou seja, este parâmetro substitui o atributo {object} da URI base da camada de serviço. Neste caso, existe uma classe "Company" que representa uma tabela do banco de dados
1É o identificador único (ID) da entidade company no banco de dados.

 

Assim sendo, no exemplo acima foi requisitada uma operação do tipo GET para o serviço, tentando buscar uma "company" com ID "1".  O retorno desta consulta, como podemos ver, é uma String com os atributos do classe representativa da entidade de banco de dados Company.

 Usando condicional:  

É a maneira que a camada de serviço realiza operações de busca um pouco mais complexa. Nela são utilizados operadores pre determinados pela arquitetura conforme podemos ver na listagem abaixo:

ConstanteRepresentação em SQLDescriçãoExemplosURI
EQ=É o operador de igualdade. Ou seja, através deste, são feitas comparações entre dois objetos dizendo se são iguais.

1 = 1: Verdadeiro

1 = 2: Falso

"teste" = "teste": Verdadeiro

"teste" = "teste1": Falso

URI~actions/find?params=enabled;eq;true
LTE<=É o operador que diz se um registro é menor ou igual a outro. Pode ser usado somente com números.

1 <= 1: Verdadeiro

1 <= 2: Verdadeiro

2 <= 1: Falso

 
GTE>=É o operador que diz se um registro é maior ou igual a outro. Pode ser usado somente com números.

1 >= 1: Verdadeiro

1 >= 2: Falso

2 >= 1: Verdadeiro

 
LT<É o operador que diz se um registro é menor a outro. Pode ser usado somente com números.

1 < 1: Falso

1 < 2: Verdadeiro

2 < 1: Verdadeiro

 
GT>É o operador que diz se um registro é maior a outro. Pode ser usado somente com números.

1 > 1: Falso

1 > 2: Falso

2 > 1: Verdadeiro

 
ST Não especificado ainda  
EN Não especificado ainda  
COCONTAINSÉ o operador utilizado para verificar se um determinado valor esta contido num campoCONTAINS(nome, "Joao"URI~actions/find?params=abbreviation;co;C1
NST Não especificado ainda  
NEN Não especificado ainda  
NCO Não especificado ainda  
INinÉ a condicional que verifica se um determinado valor está em um conjunto de dados.

1 in (1,2,4,6): Verdadeiro

1 in (2,4,6,8): Falso

 

 
ISis   
NEQ!=É o inverso do operador "=". Ou seja, ele verifica se um valor é diferente de outro.

1 != 1: Falso

1 != 2: Verdadeiro

"teste" != "teste": Falso

"teste" != "teste1": Verdadeiro

 

 

 

URI: ~/actions/find




POST

 

PUT

 

DELETE