Baixe o app para aproveitar ainda mais
Prévia do material em texto
20/10/2022 15,59 Camada de COntrde Serviços Camada de controle - serviços Prof. Denis Cople Descrição Utilização do framework Spring para criação de aplicativos Java, segundo a arquitetura MVC, tanto no modelo Web tradicional como estruturado em Web Services do tipo REST,focando nas camadas de controle e serviço, incluindo os elementos de segurança do Spring Security_ Propósito Oaluno deverá estar apto a criar sistemas Web e Web Services RESTcom grande produtividade, obedecendo ao padrão arquitetural MVC, através do framework Spring, além de lidar elementos de autenticação e autorização, via Spring Security. Com base no conhecimento adquirido, 0 aluno será capaz de implementar controladores e serviços, alinhados às melhores técnicas adotadas pelo mercado, incluindo os requisitos de segurança necessários. Preparação Antes de iniciar este conteúdo, acesse os Énecessário também configurar o ambiente, a instalação do JDK e IDE NetBeans completa, em versão com suporte a projetos Maven, além de adicionar 0 servidor Tomcat EEna insta ação da IDE.Lembre-se: de modo geral, 0 mundo da computação é colaborativo. Écomum,quandoencontramoserrosnasbibliotecasutilizadas,copiarmoso log de erro e procurarmosem qualquer motor de busca. Provavelmente, alguma resposta será retornada em algum fórum de discussão, https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços como StackOverfiow, Github, Reddit, entre outros. Não só isso é uma prática comum na comunidade de desenvolvimento de software e computação, como também nos possibilita aprender cada vez mais. Objetivos Módulo 1 Implementação da camada de controle com Spring Web Empregar o Spring Web na construção da camada de controle para sistemas MVC. Módulo 2 Implementação da camada de serviço Aplicar o Spring Boot para a construção da camada de serviços no modelo REST. Módulo 3 Implementação da camada de segurança com Spring Security mplantar o Spring Security no controle de acesso para sistemas Web e Web Services. Introdução Vamos abordar os elementos essenciais para a construção de aplicativos comerciais robustos, de forma ágil, com base no framework Spring. Nosso foco inicial será na definição de controladores e rotas, com base no Spring Web, além da adoção de repositórios Spring Data, que diminuem muito o esforço de programação necessário para a persistência. AO longo do conteúdo, teremos a definição de serviços, com base no Spring Boot, segundo o modelo REST, com utilização de dados no formato JSON. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Após a definição das camadas de controle e de serviços, utilizaremos 0 módu o Spring Security para adicionar requisitos de segurança, cumprindo com as ações de autenticação e autorização, através de diferentes modelos para controle de acesso, incluindo OAuth 2.0, onde 0 usuário é autenticado a partir de empresas conhecidas, como Google e Facebook. 1 - Implementação da camada de controle com Spring Web Ao final deste módulo, você será capaz de empregar o Spring Web na construção da camada de controle para sistemas MVC. Arquitetura MVC utilizando Spring Framework Spring Responsável por permitir a construção da camada de controle em uma arquitetura MVC (Madel, View e Controller) para a Web, sendo uma ferramenta de código aberto para a plataforma Java. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços NOSpring, temos a inversão de controle, no qual parte do fluxo de execução não é definido no código, mas efetuado a partir de um container no servidor. Ao utilizar essa abordagem, ocorre uma minimização do acoplamento no sistema, além de diminuir muito 0 esforço de programação necessário. O núcleo de execução do container é organizado em módulos, vejamos: Data Access / Integration Com gerenciamento de transações, acesso a banco de dados, mapeamento objeto-relacional e conexão mensagenas. Web Para a construção de Servlets e portlets, entre outros, dentro de uma arquitetura MVC, Core Container Consiste no coração do framework, no qual temos classes estruturais, suporte à injeção de dependências, comunicação com os componentes e a sintaxe para configurações gerais. AOP / Instrumentação Possui ferramentas para o carregamento de classes, suporte ao AspectJ e programação orientada a aspectos. Test Para a implementação de testes unitários via JUnit ou TestNG. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Quando trabalhamos com Spring, devemos criar nossas classes com as anotações necessárias, e efetuar as configurações gerais em um arquivo XML (Extended Markup Language). Atenção! Com utilização de um arquivo XML de configuração, temos acesso a diferentes serviços de middleware, sem que o código-fonte do sistema precise de modificações. A arquitetura geral do núcleo de execução pode ser observada a seguir. E) CSD Módulos do framework Spring. Arquitetura MVC A utilização do Spring promove a divisão de responsabilidades dentro do padrão MVC. De forma resumida, o spring-data fornece os recursos necessários para a camada de persistência. Sempre temos anotados, e as interfaces, em texto ou Web, sempre acessam os controladores para enviar e receber dados, 0 que está em pleno acordo com as regras da arquitetura. View Componentes e responsabilidades: Os componentes são as telas e interfaces do sistema. • Fornece as informações obtidas a partir do controle. • Envia as solicitações do usuário ao controle. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Controller Componentes e responsabilidades: Camada de COntrde Serviços • São os componentes que definem 0 comportamento do sistema. • Mapeia as opções para consultas e alterações. • Define as regras de negócio do sistema. Model Componentes e responsabilidades: • São os elementos voltados para a persistência de dados. • Encapsula o estado geral do sistema. • Trabalha com padrão DAO e mapeamento objeto-relacional. Iniciamos com a criação da entidade, que, no caso, será a classe Produto, posicionada no pacote unesa.model https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 @Entity 2 @Tab1e(name ' PRODUTO") Camada de COntrde Serviços 4 6 7 8 9 18 11 12 13 14 public class Produto implements Serializable { private String codigo; private String nome; private Integer quantidade; public Produto() { } public Produto(String codigo) { this.codigo = codigo; } public Produto(String codigo, String nome, Integer quantidade) { this.codigo - codigo; Código de criação de uma classe. A entidade JPA, definida pela anotação Entity, grava os dados na de mesmo nome, conforme especificado na anotação Table. No cnrpo da classe, temos apenas um POJO (Plain Old Java Object), com um conjunto de atributos, alguns construtores, getters e setters, além da chave Id. Deverá existir a tabela produto no banco de dados e, aqui, utilizaremos 0 Derby, ou Java 03, de fácil utilização no ambiente do NetBeans. Captura de tela da Criação da tabela Produto no Net3eans. Com 0 mapeamento objetc-relacional definido através da entidade JPA, criaremos a classe produtoDAO, no pacote unesa.dao, com os métodos necessários para consulta e inserção. Java @Component public class ProdutoDAO ( https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 4 6 7 8 9 10 11 12 13 14 Camada de COntrde Serviços @PersistenceCantext private EntityManager em; public void persist(produto produto) { em. persist(produto) ; public findA11() ( return em.createQuery( "SELECT p FROM Produto p") . getResu1tList(); de criação de uma Classe, A anotação Component coloca a classe no contexto de execução do Spring. Temos a anotação persistenceContext, do JPA, aplicada a umgerenciador de entidades, do tipo EntityManager, onde a conexão com o banco de dados será configurada ao nivel dos arquivos XML. O método persist irá adicionar os dados da entidade como um registro do banco de dados; findAll efetuará a consulta e retornará uma coleção com todas as entidades que já foram armazenadas anteriormente, A classe de serviço que utilizará produtoDAO, com as transações controladas pelo container, receberá 0 nome GerenciadorProduto, compondo o pacote unesa.controller. Java 4 6 7 8 9 18 11 12 13 @Component public class Gerenciadorproduto { @Autowired private ProdutoDAO produtoDAO; @Transactiona1 public vaid add(Produto produtoDAO. persist (produto) ; @Transactiona1(readOn1y = true) public return produtoDAO. findA11(); https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Código de criação de uma classe Camada de COntrde Serviços A anotação Autowired efetua a configuração e utilização automática de ProdutoDAO através do Spring, enquanto Transictional coloca 0 método em uma transação gerenciada pelo container. O método add será utilizado para acrescentar um produto na base, e findAll utilizará o DAO para recuperar a coleção de entidades, mas, como 0 segundo método não envolve modificação de valores, a transação pode ser definida somente leitura. Oarquivo de configuração será posicionado na raiz do projeto com 0 nome spring.xml, envolvendo os componentes relevantes do projeto. Xml 4 6 7 8 9 11 12 13 14 version-"l.e" <beans xmlns="http://www.springframework.org/schema/beans" xmlns : xsi- "http://www.1-13 . org/2ae1/XMLSchema-instance" xmlns : context="http://www.springframework.org/schema/context" xmlns : p="http:/,/www.springframework.org/schema/p" xmlns : "http://www.Springframework . org/schema/tx" xsi:schemaLocation="http:/./www.springframework.org/schema/beans http://www.springframework . org/schema/beans/spring - beans -3 . 2. xsd http://www.springframework . org/schema/context http://www.springframework . org/schema/context/spring - context -a. 3. xsd http://www.springframework . org/schema/tx http://www.springframework.org/schema/tx (context . component-scan •annotation-config / >(context . Código de configuração. Após incluir todos os namespaces necessários, temos as configurações, onde a mais simp es foi a do contexto, com a definição do pacote a partir do qual os beans serão pesquisados, que no caso é unesa, permitindo o reconhecimento de GerenciadorProduto e no contexto do Spring. A da conexão com o banco de dados tem como base a classe DriverManagerDataSource, onde as propriedades necessárias são 0 driver do Derby, a URL de conexão, usuário e senha. A conexão é utilizada na definição de uma fábrica de gerenciadores de entidades, do tipo LocalContainerEntityManagerFatoryBean, fazendo a ponte com driver JPA através da classe https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 EclipseLinkJpaVendorAdapter. Camada de COntrde Serviços As configurações para controle transacional que, por trabalhar com o UPA, serão baseadas na classe JpaTransactionManager, que encapsulará a fábrica de gerenciadores de entidades configurada anteriormente. Agora, precisamos adicionar as bibliotecas Spring Framework 5.2.9 EclipseLink (JPA2.1) Driver do Java DB No ambiente do NetBeans, basta clicar com o botão direito na pasta Libraries, escolher a opção Add Libray, e selecionar cada biblioteca. Finalmente, a criação de uma classe principal para 0 projeto, utilizando todos os artefatos gerados nos passos anteriores. Java 4 6 7 8 18 11 12 public class ExemploSpringBB1 { public static void args) { ClassPathXmlApp1icationContext ctx - new ClassPathXm1App1icationContext( "classpath: / spring . xml " ) ; Gerenciadorproduto gerenciador ctx. getBean (Gerenciadorproduto. class) ; gerenciador. add(new Produto( "Aagl " , "Caneta gerenciador.add(new Produto( iiABB2ii , "Lapisa, for(Produto p: gerenciador . findA11()) System. out . print In (p. getNome()) ; ctx.close(); IPÊ)); 238)); https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 13 } de criação de uma Classe, Camada de COntrde Serviços O contexto do Spring é recuperado, a partir do arquivo XML de configuração, na variável ctx, o que nos permite Obter os beans criados com a anotação Component. Note que ao instanciar 0 Gerenciadorproduto, temos a adição automática do ProdutoDAO, por causa da utilização de Autowired, o que garante que as operações sobre 0 banco de dados sejam efetuadas. Na sequência, vemos algumas operações de inclusão e consulta ao banco de dados, através do gerenciador, finalizando com o encerramento do contexto através do método close. Como resultado da execução, teremos 0 acompanhamento das instruções SQL geradas, bem como a listagem com 0 nome de cada produto que foi incluído na base de dados. Implementação da camada de controle Controladores e rotas Para a construção de sistemas Web modernos, é comum a adoção de controladores e rotas, onde os primeiros definem as ações que serão executadas, e as últimas definem os endereços que levarão ao acionamento das ações. A base para a construção de aplicativos Web no Spring é o pacote spring-web, onde temos a infraestrutura necessária para tratar as requisições e lidar com o mapeamento de rotas. Para cada perfil de utilização na Web, temos um pacote especializado, como: Spring-webmvc Com suporte à arquitetura MVC. Spring-webflux Usado com arquitetura de fluxo. Spring-websocket Voltada para jogos, streaming e outras comunicações binárias. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# IV78 20/10/2022 1559 Camada de COntrde Serviços Vamos iniciar com a criação de um aplicativo Web, adotando o servidor Tomcat. Adicione o framework Spring, ao final, sendo aqui utilizada a versão 4.3.29, em conjunto com JEE 7. ' Jwa JWFX Criação do projeto no Netgeans. Name Web Apphcation with Extsting Project Name ExemploWebSpring01 Project Location: Project Eolder; Criação do projeto no NetBeans. Add to Applicatiom «Nono Apache Tomca TomEE Java EE Vesion: Java EE 7 Wá Note: %urce Leve 7win be for JavaEE7 pr*ct. Contat Pah: Criação do projeto no Netgeans. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Criação do projeto no NetBeans, Criação do projeto no Netaeans. Camada de COntrde Serviços Copie os pacotes unesa.model e unesa.dao, criados no primeiro projeto. A classe DAO deve Ser alterada para acrescentar o método de remoção e as anotações para o controle transacional, sempre lembrando que a biblioteca EclipseLink (JPA 2.1) deve ser adicionada ao projeto. Java 4 6 7 8 9 le 11 12 13 14 @Component public class ProdutoDA0 { @PersistenceContext private EntityManager em; @Transactional public void persist(Produto produto) { em. persist(produto); @Transactional public void remove(String codigo) em. remove(em. find(unesa . model . Produto . class, public findA11() { codigo)); Código de criação de uma classe. Como passo seguinte, vamos criar a classe produtoContr011er, no diretório unesa.controller. Java https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 @Contra11er Camada de COntrde Serviços 4 6 7 8 9 18 11 13 @RequestMapping( " 'produtos " ) @Enab1eTransactianManagement public class ProdutoContr011er { @Autawired ProdutoDAO daa; " /dadosProduto" , — RequestMethod .GET)method - public ModelAndView dadosProduto() return new ModelAndView( "dadosProduto", new Produto()); " command" , Cód go de criação de uma classe. Esse controlador inclui as transações RequestMapping, para definir nossas rotas, EnableTransactionManagement, que habilitará o gerenciamento de transações, e RequestParam, que mapeia os parâmetros da requisição. Como temos uma rota definida ao nível da classe, todos os mapeamentos aplicados aos métodos serãoà rota inicial, ou seja, para acessar o método listaProdutos, será utilizado o endereço http://localhost:8080/NomeApp/produtos/listaProdutos. A mesma regra deve ser aplicada aos demais métodos da classe, sempre indicando a rota e o método HTTP utilizado. Neste caso, estamos adotando apenas GET ou POST A classe ModelAndView é responsável pelo relacionamento entre dados e componentes para visualização na biblioteca spring-webmvc. Na utilização direta, através do construtor, temos a página JSP de destino, 0 nome do atributo e o valor associado, conforme utilizado no método enquanto nos demais métodos temos um parâmetro ModelMap, que permite adicionar atributos diversos, e 0 nome da página JSR é retornado. Camada de Visualização Na forma padrão de utilização do Spring, 0 fluxo de execução é direcionado pelo controlador para páginas JSP,onde os dados serão tratados da forma adequada para a concepção da interface de usuário. Vamos criar a página JSP com o nome dadosProduto, no subdiretório jsp, a partir de WEB-INF. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços 4 6 8 9 18 11 12 13 14 uri= "http://www.springframework.org/tags/form <%@page contentType= "text/html" pageEncoding="UTF-8"%> html> <h1>Novo Produto</hl> (f: form <f: label path- codigo" >Codigo: </ f: label> <f: input path- " <f:label path- "nome 'i >Nome : </ f: label> <f: input path- "nome " / <f:label path- "quantidade >Quantidade : </f : label> <f: input path= "quantidade " < input value=" adicionar"/ > Código de página de interface. Ouso da taglib está relacionado à biblioteca de formulários do Spring, onde os atributos definidos no ModelAndView permitirão 0 preenchimento automático dos campos a partir do atributo path, que indica 0 campo da entidade relacionado. Para cada campo temos uma etiqueta (label) e uma caixa de entrada (input), enquanto form define o destino como a rota addProduto, interceptada no controlador, utilizando o método POST do HTTP Analisando 0 fluxo de execução, temos a chamada da rota dadosproduto, que 0 controlador irá direcionar para a página JSP, e após o preenchimento dos dados pelo usuário e envio, o clique no botão, ocorrerá a chamada para a rota addproduto. Em seguida, os dados enviados são capturados em dadosproduto, do tipo Produto, com o uso da anotação ModelAttribute, sendo efetuada a inclusão no banco através do DAO, além da adição do atributo produtos e definição da página de destino como listaprodutos. Vamos à criação da página JSp com 0 nome listaprodutos, no mesmo diretório da primeira. <%@taglib prefix='ic" uri= http://java . sun . com/jsp/jstl/core <%@page contentType= "text/html" html> https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 6 7 9 11 12 13 Camada de COntrde Serviços <h1>Lista de Produtos Cadastrados</hl> empty produtos}" > < table <td> </td> <c:forEach var: "prod" items= "${produtos}" > . . /td> Código de página de interface. Nessa página, temos a utilização da sintaxe JSTL padrão para a captura dos dados que foram enviados pelo controlador. O comando forEach permite percorrer toda a coleção do atributo items, que deve ser produtos, como no controlador, atribuindo à variável prod e gerando as linhas da tabela com os dados obtidos dos campos de cada entidade englobada, sempre através de JSTL, como em S{prod.nome). A chamada para a rota removeProduto ocorre a partir dos links gerados dinamicamente na segunda página. No fluxo de execução, o controlador irá interceptar a chamada, obtendo o código, enviado como parâmetro, com base na anotação Requestparam, seguido da remoção a partir do DAQ preenchimento do atributo produtos e retorno da página de listagem. Neste ponto, é possível observar claramente a funcionalidade do módulo Spring Web, com a definição de uma arquitetura MVC de forma automática para 0 sistema, onde temos 0 JPA sendo utilizado na camada Model, incluindo as entidades anotadas e classes DAO, a camada Controller baseada nos do Spring, os quais são acionados a partir das rotas mapeadas nas anotações, e um conjunto de páginas JSP implementando a camada View. Configurações gerais e execução Os arquivos de configuração do sistema são posicionados no diretório WEB-INF. Com relação ao dispatcher-servlet.xml, não serão necessárias alterações, pois ele apenas define as resoluções de endereço comuns, mas iremos acrescentar um arquivo com o nome app-servlet.xml, com os redirecionamentos para nosso controlador, conforme a seguir. Xml 4 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context—"http:/,/www.springframework.org/schema/context" xmlns : xsi= "http://www.w3. org/2331/XMLSchema-instance ' xsi : schemaLocation="http:/,/www.springframework.org/schema/beans https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 6 7 8 9 18 11 12 13 14 Camada de COntrde Serviços http:/,11„"4„'.springframework . org/schema/beans/spring-beans-4.3.xsd http://www.springframework . org/schema/context http://W".w.'.springframework . org/schema/context/spring - context -a. 3. xsd" > •component-scan / ><context . <bean class= "org.springframework .web . servlet .view. InternalResourceViewRes01ver" > <property name= "prefix" <property </bean> </beans> Cód go de configuravam Aqui são configurados os redirecionamentos utilizados pelos controladores dos pacotes que podem ser alcançados a partir do pacote unesa (base-package). Cada retorno dos métodos do controlador chama a página a partir do diretório WEB-INF/jsp, com o acréscimo do sufixo jsp. O arquivo applicationContext.xml será bastante modificado, pois precisará definir a conexão com 0 banco de dados e sistema de transações utilizado. Xrnl 4 6 8 9 11 12 13 14 < ?xml version- ' <beans xmlns="http://www.Springframework.org/schema/beans" xmlns - " http:/,/www.1-13 . org/2331/XMLSchema-instance":xsu- xmlns : p- "http://www.springframework . org/schema/p" xmlns : aop- " http://www.springframework . org/schema/aop" • "http://www.springframework . org/schema/tx"xmlns. xmlns:context="http:/./www.springframework.org/schema/context" xsi : schemaLocation- " http : / /www.springframework . org/schema/beans http. • / /www.springframework . org/schema/beans/spring - beans -4.3. xsd http://www.springframework . org/schema/aop http. • / /www.springframework . org/schema/aop/spring-aop-4.3.xsd http://www.springframework . org/schema/tx http://www.springframework . org/schema/tx/spring-tx-4.3. xsd Cód go de configuração https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços A configuração apresentada define a conexão com o banco de dados, no bean dataSource, uma fábrica de gestores de persistência, denominada entityManagerFactory, além do controle das transações, através do bean txManager. Com base nos elementos definidos, o framework será capaz de prover persistência com controle transacional de forma automatizada, a partir das anotações e injeção de código. As configurações finais são efetuadas no arquivo web.xml, responsável por organizar 0 conjunto de componentes do aplicativo. Xml 4 6 8 9 18 11 12 13 14 <web-app version='i3.1ii xmlns=iihttp://xmlns.jcp.org/xml/ns/javaee" xmlns : xsi= " http:/./www.w3 . arg/2aa1/XMLSchema - instance " xsi : schemaLocation= "http://xmlns.jcp.arg/xml/ns/javaee http://xmlns.jcp.org/xm1/ns/javaee/web-app_3_ «servlet> org.springframework .web. servlet . DispatcherServ1et ram- va lue> /IQEB- INF / app- servi et . xml< / param -value> Cód go de configuração As configurações efetuadas incluem a localização do arquivo de contexto, o applicationcontext.xml, e a definição de um servlet que funciona como controlador frontal para o Spring, interceptando as chamadas efetuadas para os arquivos do tipo HTML. Temos ainda um trecho que deve ser adicionado, no início de web.xml,para ativar as configurações definidas no arquivo app-servlet.xml, com a atribuição de um segundo serv et, mapeado para a raiz do aplicativo, e tendo 0 parâmetro contextConfigLocation apontando para o arquivo. Nosso sistema pode ser executado, sendo necessário ativar o banco de dados Derby, antes da execução do servidor Tomcat. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Lista de Produtos Cadastrados Execuçãodo sistema baseado moSpring Web MVC_ Arquitetura MVC com Spring Confira agora a construção de aplicativo usando a arquitetura MVC, no Java, com base no framework Spring. Para assistir a um video sobre o assunto, acesse a versão online deste conteúdo. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Falta pouco para atingir seus objetivos. Vamos praticar alguns conceitos? Questão 1 A arquitetura MVC é considerada um padrão no desenvolvimento de aplicativos cadastrais, tanto em sistemas Web, quanto desktop ou móveis. Segundo o padrão arquitetural, que divide o aplicativo em três camadas bem definidas, qual camada deveria conter os componentes do tipo DAO? A B c Controller Model Presentation https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 E Camada de COntrde Serviços Dispatcher Parabéns! A alternativa B está correta. Entre as camadas do modelo MVC temos a Model, que será responsável pelas atividades relacionadas à persistência dos dados. Os componentes DAO visam concentrar as operações sobre 0 banco de dados, meio mais comum de persistência dos sistemas cadastrais, sendo definidos ao nível da camada Model_ Questão 2 O framework Spring permite a inclusão de funcionalidades nas classes de forma simples, com base em anotações, as quais são reconhecidas pelo ferramental, gerando o código necessário para que se obtenha 0 efeito desejado. Supondo que desejamos mapear uma rota específica para 0 controlador, ou seja, associar determinado endereço a um processo de negócios de nosso sistema, qual seria a anotação adequada? A B c D E Controller EnableTransactionManagement Component RequestMapping Transactional Parabéns! A alternativa D está correta. A anotação Controller transforma a classe em um controlador, com as rotas para seus métodos mapeadas através de RequestMapping. Para habilitar o gerenciamento de transações, nosso controlador deve ser anotado com EnableTransactionManagement, fazendo com que as transações https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 2V78 20/10/2022 1559 Camada de COntrde Serviços sejam utilizadas em qualquer método anotado com Transactional, o que normalmente é indicado para os métodos do DAO que efetuam modificações sobre os dados. 2 - Implementação da camada de serviço Ao final deste módulo, você será capaz de aplicar o Spring Boot para a construção da camada de serviços no modelo REST, Conceitos Interoperabilidade Um sistema interoperável deve permitir acesso a suas funcionalidades, segundo padrões de comunicação abertos aceitos pelo mercado, tornando transparente, ou quase, o processo de integração. O elemento principal para viabilizar a interoperabilidade seria a definição de padrões de interface abertos, com 0 mínimo de acoplamento possível. Saiba mais https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Com a adoção de tecnologias como as citadas, o termo serviço tornou-se uma terminologia comum, definindo uma funcionalidade oferecida para 0 ambiente externo, com base em uma interface aderente a algum padrão especifico, sem exposição dos elementos internos. Para definir um serviço independente de plataforma, ou seja, um processo interoperável, iremos precisar de alguns elementos arquiteturais específicos: Sistema de registro e para viabilizar acessos externos. Interface de descrição de serviços, com a assinatura dos serviços disponibilizados. protocolo de comunicação, seguindo padrões abertos de ampla aceitação. Com o surgimento crescente de sistemas para Web, a disponibilização de serviços se tornou muito comum, e conceitos como B2B (Business to Business) e B2C (Business to Consumer) vieram para sintetizar os objetivos da comunicação efetuada. B2C define a comunicação entre a empresa e o consumidor, que hoje se popularizou no uso dos aplicativos para celulares. Web Services Os serviços disponibilizados na rede, ou Web Services, imediatamente adotaram padrões de comunicação abertos, nos quais despontaram os modelos: SOAP Simple Object Access Protocol. REST Representational State Transfer. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Com relação ao SOAR ele é mais antigo, sendo continuamente substituído pelo REST no B2C, mas ainda muito utilizado no B2B, devido ao seu alto nível de formalismo. Devido ao baixo formalismo do tipo REST,onde há uma grande presença da sintaxe JSON (Java Script Object Notation) na comunicação, é o tipo predominante na de sistemas que envolvam clientes moveis. Os Web Services REST apenas adotam os métodos do protocolo HTTP, como GET e POST, para efetuar operações de consulta ou inclusão de recursos, sem um sistema de registro ou descritor de serviços. Claro que a ausência do descritor de serviços irá inviabilizar a construção de clientes de comunicação de forma automatizada, exigindo maior conhecimento do desenvolvedor acerca do padrão de chamadas. Saiba mais Uma API (Application Program Interface) se refere ao conjunto de chamadas disponibilizadas para acesso a funcionalidades específicas de um sistema qualquer, comum em muitos utilitários e para 0 próprio sistema operacional. Quando os diversos serviços oferecidos por um sistema na rede, via SOAP ou REST, temos a API desse sistema. Através do framework Spring, teremos grande facilidade para criar controladores do tipo REST,permitindo a criação de APIS para sistemas corporativos Java de forma rápida. Sintaxe XML e JSON Padrão XML Padrões de escrita como XML (Extended Markup Language) e JSON (Java Script Object Notation) são voltadas para a representação de dados. Utilizam texto, com neutralidade de plataforma e transparência para firewalls, permitindo que os mais diversos sistemas trabalhem com os dados, sem risco de bloqueios na comunicação. Um documento XML bem formado é aquele que segue todas as regras de escrita, possuindo uma gramática. A gramática XML Schema Definition (XSD) pode ser observada na sequência. O uso de um namespace no documento alvo, com base em um atributo xmlns, nos dá uma breve indicação de que podemos adotar mais de uma gramática. Xml https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 <xs: schema xmlns "http://www.w3. : element Camada de COntrde Serviços 4 6 7 8 9 18 11 12 13 14 cxs : complexType> cxs : sequence> <xs:element name-"para'i type-'ixs:stringi' <xs:element <xs:element name-"assunto" :element name= "corpo" / > </xs : sequence> </xs : complexType> </xs : schema> version Exemplo de XSD e aplicação em documento XML. Oconhecimento acerca de XML é muito útil na implementação de sistemas com base em Spring, particularmente no que se refere à construção dos arquivos de configuração, algo que podemos observar no fragmento a seguir. Xml 2 4 6 version='l.g• encoding= 'UTF-8' <beans xmlns="http://v.n.n.J.springframework.org/schema/beans'• xmlns : xsi= " http : //www.w3.org/2ÊÊ1/XMLSchema-instance" xmlns : " http : /./L.n.J1.J.springframework.org/schema/p" xmlns : aop= " http : /,/www.springframework.org/schema/aop" xmlns : " http://www.springframework.org/schema/tx" Código de configuração. Note que temos um namespace default, para definir os elementos de bean, e diversos outros elementos gramaticais, como 0 uso de tx para 0 gerenciamento de transacional,ou context para os elementos relacionados ao contexto. Padrão JSON https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Para o JSON, temos apenas regras mínimas, sem qualquer especificação gramatical. As regras definidas para escrita em JSON são: Todo campo é um par chave-valor separado por dois pontos. Nomes de campos, ou chaves, são escritos entre aspas. Valores podem ser textos, numéricos, booleanos, nulos, listas ou objetos. Objetos são grupos de pares chave valor delimitados por chaves. Listas são definidas com o uso de colchetes. Por exemplo, os produtos presentes em uma base de dados poderiam ser expressos pelo documento JSON a seguir. Exemplo 'produtos': ( {"id": 1, -nome": 'Lápis", "quantidade": 500}, {"id": 2, 'nome": 'Caneta", "quantidade': 350), {"id": 3, -nome": 'Borracha", "quantidade": 400} https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 "total": 3 Camada de COntrde Serviços Web Service REST Arquitetura REST Os Web Services do tipo RESTful permitem 0 uso, entre outras opções, de JSON na comunicação, utilizando um formato mais natural para os dados, além de diminuir o fluxo necessário. O nome RESTfuI está relacionado à plena utilização REST. A característica básica do RESTé a utilização dos métodos do protocolo HTTP para oferecer os serviços de: Consulta de dados Inclusão de dados Alteração de dados Remoção de dados NOREST,a unidade de trabalho fundamental é a entidade, sempre associada a um endereço de base, e as operações efetuadas sobre ela são determinadas pelos métodos HTTP. A tabela seguinte resume a utilização dos métodos do HTTP pelo RESTe exemplos de endereços para acesso aos recursos que serão manipulados. Operação INCLUSÃO Método HTTp POST Exemplos de Endereços http://Iocalhost:8080/cadastro/produtos https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 15,59 Operação ALTERAÇÃO REMOÇÃO CONSULTA Método HTTP PUT DELETE GET Camada de COntrde Serviços Exemplos de Endereços http://Iocalhost:8080/cadastro/produtos http://Iocalhost:8080/cadastro/produtos/1002 http://Iocalhost:8080/cadastro/produtos http://localhost:8080/cadastr0/pr0dutos/1002 Tabela: Operações sobre entidades no REST Denis Cople. Na inclusão ou alteração, iremos utilizar o mesmo endereço, formado pela junção do endereço de base do sistema com 0 nome da entidade, onde temos a utilização de Produto nos exemplos. Em ambos os casos temos a passagem dos valores, para a operação que será efetuada, no corpo (body) da requisição HTTP, utilizando o formato JSON. Apesar de utilizar o mesmo endereço, o método de tratamento será diferenciado, ao nível do Web Service, com a identificação do método HTTP utilizado, podendo ser POST ou PUT. Na consulta, com base no GET, podemos efetuar a chamada descrita no parágrafo anterior, onde serão recuperadas todas as entidades do banco, na forma de uma lista JSON, ou podemos acrescentar a chave primária da entidade desejada ao endereço, tendo como exemplo 0 código do produto, 0 que irá restringir a busca, com o retorno de apenas uma entidade, os dados expressos no formato JSON. Na remoção de uma entidade, através do método DELETE,o endereço deve ser o mesmo que foi utilizado para a consulta de uma entidade, ou seja, deve incluir a chave primária da entidade. A chave será extraída do caminho (path), para que ocorra o tratamento, ao nível do Web Service, e respectiva exclusão da entidade no banco de dados. Spring Boot podemos criar de forma muito simples a camada de serviço REST,com base no Spring Boot, 0 qual define um servidor minimalista, que encapsula a implementação do Tomcat, na porta padrão 8080. A criação de projetos Spring Boot é simplificada com a utilização do gerenciador Maven, padrão do Eclipse, onde a configuração do projeto é definida no arquivo pom.xml. As bibliotecas necessárias devem ser referenciadas no arquivo, facilitando o acréscimo de funcionalidades do Spring. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Projeto ServicoSpring02 Configuração Vamos iniciar com a criação de um projeto simples, tipo Maven, denominado ServicoSpring02, Group Id "unesa" Pr*t Maven • Java wah Grade Java wah Ant Projeto servidor REST_ servidor REST. JavaFrontend Appltcation Web Apphcation EJBModule EnterpriseApplication Para facilitar a configuração do projeto, vamos acessar a ferramenta Spring Initializr, disponível no endereço site start.spring.io, onde escolher as opções desejadas do framework Spring, sendo gerado o arquivo pom.xml. Inicialmente, devemos escolher projeto do tipo Maven, linguagem Java, Spring Boot 26.3, e definir os mesmos valores utilizados no projeto para Artifact e Group. C springinitializr https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Configuração no Spring Initializr. Camada de COntrde Serviços Em seguida, vamos adicionar as seguintes dependências, com a abertura da seleção efetuada através das teclas CTRL+B, ou clique no botão ADD DEPENDENCIES,lembrando-se de segurar a tecla CTRL para a seleção múltipla: iii Spring Data JPA Spring Web Apache Derby Database As bibliotecas escolhidas, na imagem a seguir, fornecem uma estrutura mínima para 0 desenvolvimento, incluindo a persistência via JPA, arquitetura para Web e driver para acesso ao Derby. 0 300 0 2'D,w, 076 no Spring Initializr_ Ao final, clicar em GENERATE,ocorrendo o download do projeto compactado para Eclipse, substituindo arquivo pom.xml pelo gerado. Outra opção é clicar em EXPLORE, copiar o código gerado e colar sobre o conteúdo de arquivo. Talvez seja necessário algum pequeno ajuste, de forma a Obter 0 conteúdo apresentado a seguir no arquivo pom.xml do projeto. Xml B" encoding= https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços 4 6 7 8 9 18 11 12 13 (project xmlns= "http://maven . apache.org/POM/4.B.e" xrnlns :xsi- "http://www.w3. org/2gg1/XMl_Schema-instance ' xsi : " http : / /maven . apache . org/POM/4.Ê.Ê https : / /maven . (model Version a. «pa rent> . boot< / groupld> rti factld>spring- boot - starter - parent< / artifactld > < relativePath/> < ! -- lookup parent from repository - > </parent> / artifactld> Para reconhecer as modificações, clique com o botão direito sobre o projeto e escolha a opção Reload POM. Clique no botão Resolve em Resolve Project problems, caso necessário. ResolveProjectProblems- "ServicoSpS1" Project Project eroblems: Some dependency artifacts are not in the local repositor,.'. de prob emas no Camada de Serviços REST Vamos copiar a entidade dos projetos anteriores, mantendo o pacote unesa.model, sem modificações, Depois, criar outra versão do DAO,no pacote unesa.dao, mantendo 0 nome anterior (ProdutoDAO), de acordo com a listagem a seguir. Java 2 4 public interface ProdutoDAO extends JpaRepository<Produto, https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 3V78 20/10/2022 1559 Código de criação de uma classe. Camada de COntrde Serviços Note a simplicidade para a definição de um DAO com base na biblioteca Spring Data. precisamos definir uma interface descendente de JpaRepository, com o fornecimento dos tipos da entidade, no caso Produto, e da chave primária. AO executar 0 servidor, a interface de repositório será identificada, e os códigos JPA necessários para gerenciar nossas entidades serão gerados de forma automática. Entre os métodos gerados no processo, podemos destacar: Método save Utilizado tanto na inclusão quanto na alteração da entidade. Método deleteByld Utilizado para exclusão a partir da chave primária. Método findByld e findAll Utilizados nas Com a IHsistência definida, podemos criar 0 controlador, com 0 nome produtocontroller, no pacote unesa.controller, utilizando a listagem apresentadaa seguir. Java @RestController @CrossOrigin(origins - "http://localhost : 3ÊÊÊ" ) https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 @RequestMapping( " /produtos " ) 4 public class ProdutoContr011er { Camada de COntrde Serviços 6 7 8 9 10 11 12 13 14 @Autowired private ProdutoDAO daa; @GetMapping public List<Produt0> obterTodos(){ return daa. findAll(); @GetMapping( " / {codigo} " ) public Produto obter(@PathVariab1e String codigo) { return daa. findById(codigo) . get(); de criação de uma Classe, O primeiro passo foi o uso de RestController, uma anotação que avisa ao Spring para criar toda a infraestrutura necessária para 0 serviço, com 0 mapeamento do endereço inicial, que no caso é produtos, através de RequestMapping. Quanto à anotação CrossOrigin, ela serve para permitir acesso ao serviço a partir de endereços e portas externos, sendo utilizado como exemplo 0 padrão de execução de aplicativos ReactJS. O relacionamento com o DAO é determinado pelo uso de Autowired, que coloca o repositório no contexto do Spring, assumlndo a conexão padrão com 0 banco de dados e 0 gerenciamento de transações pelo Temos a utilização da anotação GetMapping para as consultas, onde obterTodos retorna todas as entidades do banco, a partir de uma chamada para findAll, enquanto obter resgata a chave primária presente no endereço, e utiliza findByld para retornar 0 produto correto. Comentário Note como a parte dinâmica do endereço é definida entre chaves, sendo recuperada nos parâmetros de Obter através da anotação PathVariable. Para a remoção, é utilizada a anotação DeleteMapping com a chamada para deleteByld. Como não temos o retorno de valor (tipo void), 0 serviço é classificado como one Way. Enquanto 0 método inserir é anotado com PostMapping, alterar recebe PutMapping, sendo que, em ambos os casos, temos a passagem dos valores para a entidade fornecidos no corpo do método, no formato JSON. Note a recuperação desses valores ao nível dos parâmetros de cada método, com base na anotação https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços RequestBody, e a chamada para o método save do DAQ serve tanto para a inclusão quanto para a alteração de um produto. Conexão com o banco de dados Agora, precisamos configurar a cmlexão com o bancx),utilizando um arquivo de propriedades, o que deve ser iniciado com a criação de um novo diretório de códigos-fonte, clicando com 0 botão direito sobre 0 projeto e escolhendo a opção New, seguida de Folder. Name and Folder Name: resources . datasource. hikari . maximumP001Size=2e Project: ServicoSpring02 Parent Folder. Definição do diretório de recursos do Spring Boot. Browse„. Iremos criar, na raiz do novo diretório, um arquivo com 0 nome onde ficarão as configurações necessárias para a execução do Spring Boot. Java 4 6 8 9 11 12 13 14 # Derby connection settings spring. datasource . url=jdbc : derby: / / localhost : 1527 / exemploÊÊ1 spring. datasou rce. username=exemploael spring. data sou rce. pa ssword=exemploael spring. datasou rce.driver-class-name=org.apache . derby . jdbc .ClientDriver # HikariCP settings spring. data source. hikari . minimumId1e-S id1eTimeout-3eaag Spring. datasou rce. hikari . maxLifetime=2B338ÊÊ datasource. hikari . connectionTimeout-3eeee Spring. datasou rce. hikari . poolName=HikariP001Exemp10ÊÊ1 sprlng sprlng. sprung. datasource. hikari . Cód go de arquivo de configuração https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Na primeira parte do arquivo, temos a configuração do JDBC (Java Database Connectivity), onde devem ser fornecidos 0 endereço de conexão, usuário, senha e driver de acesso. O de conexões, com base no Hikari, permite que um menor número de conexões atenda a uma grande quantidade de usuários. Foi utilizada uma configuração comum, tamanho máximo de vinte conexões, com o nome HikariP001Exemp10001 , Na configuração do JPA (dialeto do Derby), a escolha da opção none permite a criação automática de tabelas, evitando que os dados sejam apagados a cada nova execução. Oprograma principal, incluindo o método main, com a chamada para o método run de SpringApplication, será denominado de ServicoSpring02, inserido no pacote unesa. Java 2 4 6 @SpringBootApp1ication @ComponentScan(basePackages - "unesa") public class ServicoSpringe2 { public static void args) { SpringApp1ication . run(ServicoSpringe2. class, args) ; Código de criação de uma classe para o programa principal. Temos a anotação SpringB00tApplication, para configurar a classe como principal do aplicativo, e ComponentScan, definindo a busca por componentes a partir do pacote unesa. No código interno da classe, temos a execução a partir da chamada para run, com a passagem da classe principal do sistema, que, no caso, é a própria classe ServicoSpring02. Podemos executar o sistema, lembrando de ativar o banco Derby antes, efetuando o teste com o acesso ao endereço localhost:8080/produtos. O retorno será uma lista JSON com os produtos. a x localhost:8080/pmdutos [{"codigo : " {"codigo " Aeeel"," : "Beee2 nome , "nome : "BANANA" , "quantidade" : leee}, " : "JABUTICABA" , "quantidade" : 75e}] Teste do serviço criado comi Spring Boot https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 REST com Retrofit Retrofit Camada de COntrde Serviços Ouso de métodos como PUT e DELETEpelo nosso Web Service, além da adoção de JSON na comunicação, pode dificultar testes tradicionais, baseados em formulários HTML. Retrofit, para a plataforma Java, permite 0 uso de todos os métodos do HTTP de forma simplificada, trabalhando com diversos conversores, alguns deles capazes de efetuar o mapeamento automático dos dados no formato JSON para objetos Java. Projeto ClienteRest Vamos definir nosso cliente em um projeto Java padrão, com base em Maven, adotando 0 nome ClienteREST, e unesa como valor de Group Id, conforme observado a seguir. Pr*t Mavm ' CJ Javawah Graae Java wah Ant Criação do projeto para o cliente REST Criação do projeto para o cliente REST JavaFrontend Application WebApplication UB Module EnterpriseApplication O passo seguinte será a inclusão da dependência referente ao Retroflt com 0 clique do botão direito sobre a divisão Dependencies do projeto, escolhendo a opção Add Dependency. O Group Id será com.squareup.retr0flt2, Artifact Id terá 0 valor retroflt e a versão utilizada será 2.9.0. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 15,59 Add Group ID: com.squareup.retr0fit2 Artifact ID: retrofit yersion: 2.9.0 Acréscimo de dependencia em projeto Mavem Camada de COntrde Serviços *ope: compae Repetiremos o processo, adotando os mesmos Group Id e versão, mas, agora, para o artefato converter- jackson, e após acrescentar as dependências, nosso arquivo pom.xml estará com a codificação a seguir. Xml 4 6 7 8 9 18 11 12 13 14 <?xml version-'il.e'i (project xmlns= "http://maven . apache.org/POM/4.B.e" xmlns : xsi- "http://www.1-13 . org/2gg1/XMLSchema-instance" xsi : schemaLocation= " http : / /maven . apache . org/POM/4.Ê.Ê http://maven.apache.org/xsd/maven-4.a.3.xsd"> <mode1Version a. a</mode1Version > <packaging>jar</packaging> (dependencies> (dependency> <groupld>com.squareup.retrofit2</groupld> Código de criação de configuração A biblioteca Retrofit permite trabalhar com todos os métodos HTTP, tanto de forma síncrona quanto assíncrona, através de interfaces Java. Utilizaremos 0 modo síncrono, pela simplicidade do programa. Definiremos uma classe de dados para Produto, onde pderíamos utilizar a entidade original, mas não equivaleria a uma situação real, onde fosse adotada uma API de terceiros. Iremos criar a classe Produto, no pacote de acordo com a listagem seguinte. Note que buscamos utilizar a forma mais simplespossível para os objetos que serão instanciados, com a utilização de atributos públicos equivalentes aos campos do JSON. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 37/78 20/10/2022 1559 Camada de COntrde Serviços Java 2 4 6 public class Produto { public String codigo; public String nome; public Integer quantidade; Cód go de criação de uma classe (somente a estrutura de dados). Em seguida, definimos a interface de comunicação ProdutoService, no pacote unesa.retrofit, contendo o código a seguir. Java 4 6 7 8 9 18 11 12 13 14 public interface ProdutoService { @GET( "produtos Call<List<Produt0>> obterTodos(); "produtos/ {cod igo} ) String codigo); " produtos " ) produto produto) ; "produtos/ {codigo} " ) Call<Void> String codigo); "produtos " ) Código de criação de uma interface. As anotações GET, POST, PUT e DELETE irão definir o tipo de método HTTP utilizado, além da rota de acesso ao recurso entre parênteses. NOcaso de caminhos com identificação do recurso, como na obtenção de um produto pelo código, o trecho identificador é colocado entre chaves, sendo relacionado a um parâmetro do método através da anotação path, algo que pode ser observado nos métodos Obter e deletar. Para envio de dados JSON no corpo da chamada, basta definir um parâmetro do tipo da entidade, que, no https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços caso, é Produto, anotado com Body, e todos os métodos encapsulam o retorno em um objeto genérico Cal'. Oencapsulamento do tipo de retorno serve para trabalhar: Tanto de forma síncrona Através de uma invocação via execute. x Quanto de forma assíncrona Através de uma chamada enqueue e a criação de um objeto CallBack. para que a interface de serviços seja implementada de forma automática, deve ser instanciado um cliente Retrofit, onde o conversor de JSON será especificado. A criação do cliente segue o padrão de desenvolvimento Builder, permitindo configurações diversas de uma forma muito dinâmica e simples. Vamos ver como fica? Resposta Retroflt retroflt new Retroflt.BuiIder() .baseUrl("http://localhost:8080") .addConverterFactory(JacksonConverterFactory.create()) .build(); ProdutoService service = retrofit.create(ProdutoService.class); Configurações para 0 Retroflt incluem 0 endereço de base das chamadas RESTe a classe para conversão dos dados, que, no caso, é a JacksonConverterFactory. Com o cliente instanciado, a interface é imp ementada a partir de uma chamada do tipo create. A seguir, a utilização das chamadas em nossa classe principal, a qual será criada no pacote unesa.clienterest, com o nome ClienteREST. Java public class ClienteREST ( public static void main(String[] args) throws Exception { Retrofit retrofit - new Retrofit.Builder() https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 4 6 7 9 18 11 12 13 Camada de COntrde Serviços . basel_lrl ( "http://localhost : 8883" ) . . create( ) ) .build(); ProdutoService service retrofit . create(produtoservice. class); // Processando de forma sincrona Produto pl pl.codigo - pl . nome = new Produto(); "MANGA" ; pl.quantidade - 58a Código de criação de uma classe, As chamadas efetuadas para o serviço são muito semelhantes à execução padrão de métodos Java, mas todas seguidas de execute, pois estamos utilizando 0 modo síncrono dos objetos do tipo Call. Temos ainda a captura do retomo, na forma de objetos e coleções Java, encadeando uma chamada para body. A execução do cliente exemplo irá fornecer a saída ilustrada a seguir, lembrando que o servidor deverá estar executando. BANANA (NI) : 1000 MANGA (9002) : eoo SUCCEss Total time; 4.678 s O•put Execução do cliente REST A biblioteca Retrofit é muito utilizada para a comunicação Web Services REST nos aplicativos para Android, onde, devido à exigência de processos paralelos para de entrada e saída, seria necessário utilizar o modelo de chamada assíncrona, como a seguir. Java 4 service.obterTodos() . enqueue(new { public void onResponse(Ca11<List<Produt0>> cal 1, response) { for (Produto p . response. body()) { https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 6 7 8 9 18 11 12 Camada de COntrde Serviços System. out. println(p. nome*" ("+p . id+"): "+p . quantidade); public void cal 1, Throwable t) { na conexão"); Modelo de chamada assíncrona. Na criação de sistemas REST, tanto do lado cliente quanto do lado servidor, com a utilização das bibliotecas e frameworks corretos, boa parte da implementação é delegada para ferramentais especializados, como Spring Boot e Retrofit, permitindo um desenvolvimento ágil e de alta qualidade. Web Service RESTful com Spring Confira agora a construção de Web Service do tipo RESTful, no Java, com base no framework Spring. Para assistir a um video sobre o assunto, acesse a versão online deste conteúdo. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 41178 20/10/2022 1559 Camada de COntrde Serviços Falta pouco para atingir seus objetivos. Vamos praticar alguns conceitos? Questão 1 Embora os sistemas cadastrais para Web tradicionais, dentro de uma arquitetura MVC, cumpram efetivamente com as necessidades de gerenciamento de dados em uma empresa, a comunicação com os clientes, no modelo B2C, deve se adequar às plataformas mais utilizadas por eles. Atualmente, é inegável a preponderância dos dispositivos móveis como plataforma cliente, e os aplicativos precisam se comunicar com serviços na Web, onde ocorre apenas 0 trânsito de dados, sendo delegado para aplicativo a responsabilidade do desenho das telas. Qual o formato de arquivo adotado preferencialmente na comunicação B2C? A XML https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 B c D E Camada de COntrde Serviços JAVA RSS DTD JSON Parabéns! A alternativa E está correta. A forma mais utilizada de com clientes móveis, segundo um perfi B2C,é através de Web Services do tipo RESTful, onde 0 JSON é adotado como formato padrão, para a troca de informações, Serviços também podem ser utilizados na B2B, mas ocorre uma exigência maior quanto ao formalismo, onde 0 XML pode ser mais adequado, já que a definição de gramáticas via XSD ou DTD Questão 2 Para que um serviço seja aderente ao modelo REST,deve fazer o uso correto dos métodos disponibilizados pelo protocolo HTTP,e 0 mapeamento das rotas do controlador REST,quando utilizamos o framework Spring, é feito com base em anotações. Supondo que você queira definir o mapeamento de um método, no controlador REST,que promova a inclusão de um registro na base de dados, qual anotação deveria ser utilizada? A c DeleteMapping PutMapping postMapping https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 D Camada de COntrde Serviços GetMapping PatchMapping Parabéns! A alternativa C está correta. No modelo REST, os métodos do HTTP apresentam relação direta com as operações efetuadas sobre o banco de dados. para efetuar uma consulta, usamos 0 método GET, inclusão de dados é feita via POST, alterações são feitas com base em PUT, com dados completos, ou PATCH, para dados parciais, e a remoção ocorre com base no DELETE.Se 0 método em questão causa uma inserção de dados, a anotação correta seria PostMapping. 3 - Implementação da camada de segurança com Spring Security Ao final deste módulo, você será capaz de implantar o Spring Security no controle de acesso para sistemas Web e Web Services, https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Camada de segurança Autenticação e autorização O framework Spring traz um componente denominado Spring Security, que simplifica todas as tarefas relacionadas à manutenção da segurança. para que um usuário possa acessar um sistema com acesso controlado, primeiramentedeve ser autenticado, ou seja, através de algum processo de identificação, como login e senha, provedor OAuth 2.0, ou integração com Active Directory, entre outros, precisa provar que é um usuário autêntico para 0 sistema. Neste contexto, é importante compreender a diferença entre: Codificação x Criptografia Codificação e Criptografia A palavra codificação significa transformação Oumodificação de formato, como na tradução de um algoritmo em uma linguagem de programação. Um destaque, para o armazenamento e transmissão de dados, é a codificação para Base", Qualquer codificação deve utilizar uma função de transformação reversWeI, para a obtenção da representação desejada, onde a recuperação do dado original é conhecida como decodificação. Na criptografia, precisamos de uma chave para efetuar as transformações, garantindo 0 sigilo. Temos dois tipos de criptografia: Criptografia simétrica Utilizamos uma mesma chave para efetuar tanto a criptografia quanto a decriptografia. Criptografia assimétrica https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Utilizamos um par de chaves. As chaves costumam ser geradas a partir de grandes números primos. Vamos entender um pouco mais sobre as chaves. Enquanto a chave privada é armazenada de forma segura, a chave pública é distribuída, permitindo 0 envio de informações criptografadas por qualquer pessoa, mas que só poderão ser abertas pela chave privada do destinatário. No caminho contrário, apenas a chave privada é capaz de assinar um documento, enquanto a chave pública permite conferir a assinatura. Ainda temos a criptografia destrutiva, também conhecida como hash, onde ocorre a perda de fragmentos dos dados originais, impedindo a decriptografia, o que a torna útil para guarda de senhas, tendo como exemplos comuns os algoritmos MD5 e SHAI. Existem dois níveis de autorização que devem ser considerados: Relacionado à funcionalidade ou serviço por exemplo, 0 cadastro de aluno. Relacionado aos dados de domínio Por exemplo, como um aluno pode ver apenas suas próprias notas. As de primeiro nível precisam apenas da identificação de recursos e definição de direitos de acesso aos mesmos. Como seria complexo atribuir um grande conjunto de direitos a cada usuário, definimos perfis com conjuntos de direitos, e associamos os usuários aos perfis. De forma geral, a biblioteca Spring Security irá viabilizar a autenticação e a autorização de primeiro nível, enquanto um segundo nível seria mais complexo e envolveria regras próprias do sistema. Sistemas Web com Spring Security https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Arquitetura do Spring Security Sistemas criados na plataforma Java para Web sempre trabalham com base em componentes do tipo Servlet, mesmo quando utilizamos páginas JSP. Para que a segurança seja efetiva, é necessário interceptar a chamada HTTP antes do tratamento pelo Servlet, e como as rotas definem o acesso aos recursos, tornam-se o local ideal para a configuração de regras de acesso. Um padrão de desenvolvimento utilizado para o tratamento da requisição é o Intercept Filter, definindo um filtro para interceptação, tratamento e direcionamento do fluxo de execução, 0 qual permite Sua inclusão na arquitetura, sem a modificação dos demais componentes que compartilham o ambiente. Podemos ainda utilizar uma sequência de filtros, por onde a requisição deverá passar, antes de chegar ao Serlvet, formando o que é conhecido como Filter Chain, e alguns deles podem atuar nas ações de autenticação e autorização. A arquitetura do Spring Security é completamente baseada no padrão Filter Chain, mas como existem diferentes formas de autenticação, além de diferentes rotas, utilizamos um filtro de segurança principal, do tipo DelegatingFilterProxy, o qual faz um desvio temporário para uma ou mais cadeias de filtros, do tipo SecurityFilterChain, responsáveis pela avaliação de cada regra de acesso adotada no sistema. f iIt"Chain Filter Utilização do padrão Filter Chain pelo Spring Security Saiba mais para saber mais sobre a utilização do padrão Filter Chain pelo Spring Security, no seu site de busca "docs.spring.io/spring-security/reference/servlet/architecture" e clique na primeira opção que surgir. Cada componente do tipo SecurityFilterChain será responsável pelo tratamento de uma rota específica, sendo composto por uma grande sequência de filtros do Spring Security, onde estão incluídos elementos como CorsFilter, para verificação de regras de acesso cruzado, LogoutFiIter, para efetuar a desconexão do sistema, OAuth2LoginAuthenticationFilter, relacionado ao uso de autenticação via OAuth 2.0, entre diversos outros. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 47/78 20/10/2022 1559 Camada de COntrde Serviços Um filtro que merece atenção especial, e que fica posicionado próximo ao final da sequência, é o ExceptionTransIationFilter, responsável por interpretar os erros detectados nos filtros anteriores e direcionar o fluxo para o endereço de resposta correto para cada tipo de erro. O processamento efetuado por ExceptionTranslationFilter envolve três passos: Inicialmente, é invocado doFilter, com passagem da requisição e reposta, para invocar 0 processamento do resto da aplicação quando não ocorrem exceções. NOcaso de uma exceção de segurança do tipo AuthenticationException, é iniciado um contexto para autenticação, ou seja, o contexto de segurança é limpo, a requisição atual é armazenada em cache para a continuidade do fluxo após 0 login, e 0 ponto de entrada para autenticação (AuthenticationEntryPoint) é invocado, podendo ser uma página de login, verificação por OAuth 2.0 ou através do protocolo HTTP,entre outros. Para uma exceção do tipo AccessDeniedException, ocorre o desvio para o tratamento de erros relacionados à autorização de acesso. A imagem apresentada a seguir permite visualizar o fluxo de execução descrito para o filtro do tipo ExceptionTraslationFilter. Funcionamento do SecurityFiIterChain Saiba mais https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Para saber mais sobre o funcionamento do SecurityFilterChain, coloque no seu site de busca "docs.spring.io/spring-security/reference/servlet/architecture" e clique na primeira opção que surgir. Exemplo com Spring Web Com base nos recursos do Spring Security, a autenticação em um projeto Web tradicional envolve algumas definições em arquivos XML ou uma classe para a configuração do acesso. Vamos voltar ao primeiro exemplo com Spring Web (ExemploWebSpring01), que executa sobre o servidor Tomcat, e efetuar todas as modificações necessárias. Precisamos baixar as bibliotecas necessárias, e adicioná-las ao projeto através do clique com o botão direito na divisão Libraries, e escolha da opção Add JAR/Folder. Todas as bibliotecas são oferecidas no repositório Maven do Spring Framework, segundo os endereços indicados a seguir, onde foi adotada a versão 4.2.9 do conjunto de bibliotecas: Spring-security-web Endereço para download: https://repl.maven.org/maven2/org/ springframework/security/spring-security-web/4.2.9.RELEASE/ Spring-security-config Endereço para download: https://repol.maven.org/maven2/org/ springframework/security/sprin g•security-config/4.2.9. RELEASE/ Spring-security-core Endereço para download: https://repol.maven.org/maven2/org/ springframework/security/ spring-security-core/4.2.9.RELEASE/ O repositório permite navegação ao estilo FTP (File Transfer Protocol), onde devemos buscar os arquivos de extensão jar para cada uma das bibliotecas. podemos observar 0 acesso da primeira biblioteca para download na figura seguinte. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 15,59 Camada de COntrde Serviços enta X + 2018 -le-16 03: 31 spring-security-web-4.¿.9. RELEASE2018- 10-16 03:31 jaca— 2018 -10-16 03:31 2018-10-16 03 : 31 2018-1'3-16 03:31spcingse.c.u.ci-ty-web-4.2.9. • Download de biblioteca do Spring Security 2018-10-16 03:31 128 32 40 388414 821 32 Após adicionar as bibliotecas ao projeto, vamos trabalhar apenas com elementos de configuração na sintaxe XML_ Criaremos 0 arquivo security.xml, na pasta WEB-INF. Xml 4 6 7 8 9 18 11 12 13 14 <?xml version-'il.e'i <b:beans xmlns= "http://www.springframework.org/schema/security ' xmlns : b—"http://www.springframework . org/schema/beans" xmlns : xsi= "http://www.w3. org/2a81/XMLSchema-instance ' xsi : schemaLocation- " http://www.Springframework . org/schema/beans https : / /www.springframework . org/schema/beans/spring - beans. xsd http:/'w."".springframework . org/schema/security https : / /www.springframework . org/schema/security/spring - security. xsd" > <http <intercept-url pattern-" 'produtos/ " 'USER' / > </http> <authenticatian-manager> <authentication-provider> Código de criação de configuração Temos a definição de dois usuários, usul e usu2, com respectivas senhas e perfis, onde aqui são definidos ROLE_GUESTe ROLE_USER,no trecho user-service, interno às tags para definição do gerenciador de autenticação, além da interceptação dos endereços relacionados a produtos, por meio da tag intercept-url, condicionando 0 acesso para usuários com perfil USER. Precisamos efetuar alterações no arquivo web.xml, com 0 acréscimo do novo arquivo de configuração entre os elementos de contexto, e a definição de um filtro para interceptação das requisições. A listagem seguinte apresenta as inserções. https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços 4 6 7 8 9 10 11 12 13 14 < ! -- Inicio do trecho modificado -- > (context -param» (pa ram- / param - name> /WEB- INF/app1icationContext . xml /WEB-INF/security. xml </param-value> </ context-param> <listener> < listener-class> org.springframework .web. context . ContextLoaderListener de criação de configuração, Além de incorporar as configurações de segurança anteriores, temos a definição do componente DelegatingFilterProxy, descrito anteriormente em nossa análise da arquitetura do Spring Security. As configurações efetuadas são suficientes para o bloqueio da página com a listagem dos mas ainda precisamos de modificações nos arquivos JSP para garantir a navegabilidade do sistema. A alteração em listaprodutos.jsp envolve o acréscimo de um link para 0 índice, antes da tabela com os produtos. Vejamos o trecho modificado. 2 4 6 <html > <body> de produtos ca href=" . empty produtos} de criação de página de interface. Uma alteração levemente mais complexa será feita no arquivo index.jsp, onde apresentaremos 0 nome do https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 5V78 20/10/2022 1559 Camada de COntrde Serviços usuário Iogado, além de um botão para efetuar o logout, mas apenas quando ocorre uma autenticação anterior. uri: "http://java . sun . <%@page contentType= "text/html" 4 6 8 9 10 11 12 13 14 prefix= "c" (body» empty pageContext . <c:url value=ii / < form usuário Logado: < input type-"submit" value-" Log out" (input type= "hidden" parameterName) " . token} Código de página de interface. Ocódigo começa com 0 teste do usuário logado, reconhecido pelo atributo remoteUser, e se tiver ocorrido a autenticação, criamos um form para chamada do endereço de logout, com a passagem de alguns campos escondidos com 0 token da autenticação. Temos a exibição do nome do usuário logado, junto ao botão que efetua o logout. Executando o sistema, e clicando no link para a listagem de produtos, somos redirecionados para a tela de login, sendo utilizada a tela padrão do Spring Security, mas podemos personalizar a página utilizada através de algumas configurações nos arquivos XML. o x Login with Username and Password Usa: Login padráO, https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Entrando com os dados de usul, será liberado o acesso à listagem de produtos, onde podemos clicar no link para retorno ao índice, verificando 0 nome do usuário ogado. A partir daí, poderemos efetuar a desconexão (logout) do sistema. o x Usuário Logado: usul Produt0\ Índice do sistema com usuário Iogado_ Podemos efetuar o logout do sistema, e entrar com o usuário usu2, com perfil GUEST.Veremos um bloqueio por falta de direitos, ou seja, erro 403, representando um usuário não autorizado. HTTP Status 403 — Forbidden The seve to Exemplo de acesso não autorizado Por questões de simplicidade, utilizamos usuários predefinidos, representados em memória, mas como ainda não estamos criptografando as senhas, a alteração necessária para utilizar uma tabela de usuários pode ser feita modificando o arquivo security.xml. Xml 4 6 7 8 9 <b:beans xmlns-"http://www.springframework.org/schema/securityi' xmlns : b—"http://www.springframework.org/schema/beans" xmlns :xsi- "http://www.w3. org/2BB1/XMLSchema-instance ' xsi : " http://www.springframework . org/schema/beans https : / /'„ww. springframework . org/schema/beans/spring - beans . xsd http://www.springframework . org/schema/security https : / /waw. springframework . org/schema/security/spring - security. xsd" > https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços 11 12 13 <http auto-canfig= < intercept-url pattern-" 'produtos/ " </http> 'USER' Cód go de configuração Foi definido um bean para acesso ao banco de dados, com o nome dataSourceSec, configurado para utilizar 0 banco de exemplo que temos adotado desde 0 início do tema: temos como parâmetros 0 endereço do classe para acesso, usuário e senha. Já no gestor de autenticação, passamos a utilizar a tag jdbc-user-service, fazendo referência ao bean de conexão definido, com o nome dataSourceSec. Especificamos as instruções SQL para consulta ao usuário pelo nome, no atributo users-by-username-query, e para a consultar 0 perfl do usuário, com base no atributo authorities-by-username-query. A tabela deverá ser criada no banco de dados. USERS PAW" ORO Criação da tabela de usuários. ARCHAR Precisamos alimentar a tabela com os mesmos dados dos usuários em memória, que foram utilizados na configuração inicial, e executar o sistema novamente. I Max. rows: Fetched Rows: 2 1 2 USERNAME usul usu2 PASSWORD 1234 5678 Usuários cadastrados na tabela. Segurança no REST https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços Modelo de Segurança do REST Quando trabalhamos com REST,temos acesso aos serviços pelo protocolo HTTR sem uma tela de login, ocorria para um sistema Web padrão, o que nos leva à necessidade de um meio alternativo para autenticação, diretamente pelo protocolo. Além disso, serviços não gerenciam estados, 0 que exige a passagem das credenciais a cada chamada efetuada. Na prática, o que temos é um token de acesso, com os dados necessários para a autenticação, que deve ser fornecido através do cabeçalho da requisição. Para exemplificar o modelo de segurança do REST,modificaremos nosso servidor de exemplo ServicoSpring02, construído anteriromente. Começamos com 0 acréscimo da dependência necessária no arquivo pom.xml, conforme o fragmento seguinte. Xml 2 4 (dependency> . boot< / groupld> <artifactld >spring- boot - starter - security< / artifactld> </dependency> Pode ser necessário ativar a resolução de prob emas, com o clique do botão direito sobre o nome do projeto e escolha da opção Resolve Project problems. podemos executar nosso projeto e acessar 0 endereço onde já será verificada a atuação do sistema de login. Please sign in Sign in Tela padrão de login para o Spring 800t, https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559Camada de COntrde Serviços Vamos começar a configurar os aspectos de segurança, desta vez, através do conjunto de anotações do Spring Security, Criaremos a classe ConfigSeguranca a seguir no pacote Java 4 6 7 9 11 12 13 14 @Configuration @EnableWebSecurity public class ConfigSeguranca extends WebSecurityConfigurerAdapter { @Bean @Override public userDetai1sService userDetai1sService() { UserDetai1s user User.builder() .username( "usul " ) . . encode( "1234" ) ) . roles( "USER") . build(); return new InMemoryUserDetai1sManager(user) ; @Bean de criaçáo de uma Classe, Criptografia com REST No exemplo RESTpassaremos a adotar criptografia, tendo tnmo base um bean do tipo BCryptPasswordEncoder. Ele fará a criptografia de senha dos usuários, e embora utilizemos aqui para usuários em memória, seria declarado e invocado da mesma forma ao nwel de um controlador associado à persistência em banco de dados. O método userDetailsService será responsável pelo retorno do bean padrão para gerência de usuários, onde aqui temos apenas o usuário usul, com senha criptografada e perfil USER,mas sendo possível incluir usuários na sequência do builder. Ao final, é retornado o gerenciador em memória, instanciado como um objeto do tipo InMemoryUserDetailsManager, tendo como parâmetro nosso usuário gerado no passo anterior. Finalmente, temos a sobrescrita do método configure, onde são definidas as regras de acesso para o sistema, sempre a partir de http, do tipo HttpSecurity. Seguindo 0 fluxo de chamadas, é exigida autenticação, mas com livre acesso para raiz e índice (permitAll), enquanto o caminho produtos é restrito ao perfil USER(hasR01e), 0 que é concatenado com 0 meio de autenticação, diretamente pelo protocolo HTTP https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Camada de COntrde Serviços (httpBasic). Como o objetivo será autenticar via requisição, será necessário desabilitar a proteção padrão de sistemas Web, utilizando csrf e disable. Criaremos uma classe para respostas de texto, com 0 nome MensagemSimples, no pacote unesa.model, a qual será utilizada na resposta padrão, ao nível da raiz. "http://10ca1host:3eee") Java 4 6 8 9 18 11 12 13 14 public class MensagemSimples { String titulo; String mensagem; public MensagemSimp1es(String titulo, this.titulo = titulo; this .mensagem - mensagem; String mensagem) { public public public public String getTitu10() { return titulo; } vaid set Titulo(String titulo) { this.titulo titulo; String getMensagem() { return mensagem; } void setMensagem(String mensagem) { this . mensagem mensagem; Código de criação de uma classe Definimos uma classe para representar respostas do servidor, com o título e a mensagem, que será utilizada pelo controlador mapeado para a raiz. Em seguida, a criação do controlador, com 0 nome IndexContr011er, no pacote unesa.controller. Java 4 6 7 8 9 @RestContr011er @RequestMapping( " / " ) public class IndexController { @GetMapping public MensagemSimples return new MensagemSimp1es( "Status" , "Conexão efetuada com sucesso"); https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 57/78 20/10/2022 1559 11 12 13 14 } Camada de COntrde Serviços @GetMapping( " index " ) public MensagemSimp1es return acessar(); Código de criação de uma classe Ocontrolador concentra os mapeamentos para a raiz e para o endereço index, ambos com a mesma resposta padrão. Já que 0 acesso para esses caminhos foi definido como livre (permitAll), podemos executar o sistema e acessar a raiz, sem autenticar, obtendo a resposta a seguir. localhost:8080 C (D localhost:8080 {"titulo" : "Status" , "mensagem" : "Conexão efetuada Resposta padrão do servidor REST AOacessar 0 endereço localhost:8080/produtos, será solicitada a autenticação via HTTP, com a apresentação do login padrão do navegador. Solicitações HTTP do Retrofit Vamos ajustar o cliente REST para trabalhar com autenticação, fornecendo as credenciais nas solicitações HTTP do Retroflt. Retornando ao projeto ClienteREST, acrescentar uma dependência no pom.xml, referente ao Objeto necessário para interceptar a requisição HTTP. Xml 2 4 6 (dependency> <groupld>com.squareup .Okhttp3</groupld> <artifactld>okhttp</artifactld> https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 Cód go de configuração. Camada de COntrde Serviços Após recarregar a configuração do Maven e solicitar a resolução de problemas do projeto, estaremos aptos a utilizar a biblioteca para interceptação de requisições HTTP. Para tal, vamos criar a classe InterceptadorLogin, no pacote unesa.security, com 0 código a seguir, 4 6 7 9 11 12 13 14 public class InterceptadorLogin implements Interceptor { private String token; public InterceptadorLogin(String token) this . token token; averride public Response intercept(Chain chain) throws IOException { Request original - chain.request(); Request.Bui1der builder original.newBui1der() . header( "Authorization " , builder.build();Request request return chain. proceed(request); de criaçáo de uma Classe, token) ; O funcionamento da classe é baseado no método intercept como implementação de A partir da cadeia de execução (chain), obtemos a requisição corrente, geramos uma nova requisição a partir da original, com a inclusão do token de autorização no header, e procedemos com a execução da nova requisição. Como podemos observar, tudo 0 que a nova classe faz é inserir as informações de autenticação no cabeçalho da requisição, sendo que o token deve ser fornecido no construtor. Criaremos a classe GestorServico, no pacote unesa.security, para definição do cliente Retrofit com inserção de credenciais. public class GestorServico { private final OkHttpClient . Builder httpC1ient - new OkHttpC1ient . Builder(); https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 4 6 7 8 9 18 11 12 13 14 Camada de COntrde Serviços private final Retrofit retrofit; public GestorServico(String user, String password) { String token = Credentials.basic(user, password); InterceptadorLogin interceptador - new Interceptadorl-ogin(token); httpClient . addlnterceptor (interceptador) ; retrofit new Retrofit.8ui1der() . baselJr1 ( " http://localhost : 8888" ) . client(httpclient.build()) Cód go de criação de uma classe, Existe muita semelhança com 0 código do cliente RESTsem autenticação, mas agora utilizamos um cliente do tipo OkHttpClient na instância do Retrofit. Para configurar nosso cliente HTTP, primeiro obtemos o token a partir do usuário e senha fornecidos, 0 que é feito pela classe Credentials, depois instanciamos um Objeto do tipo InterceptadorLogin com a passagem do token, e finalmente anexamos o interceptador ao cliente HTTP através de addlnterceptor. A classe principal ClienteREST precisa de uma leve modificação para uso do novo gerenciador, sendo 0 trecho modificado apresentado a seguir. Java public static void args) throws Exception { 2 4 6 ProdutoService service - new GestorServico("usu1", pl new Produto(); "1234") . createService(); Produto // Todo o restante do método permanece inalterado Código de modificação de um trecho de uma classe, Podemos executar nosso cliente REST, obtendo os mesmos resultados da versão original, mas agora com autenticação efetuada via token, através do protocolo HTTP. Autenticação com OAuth 2.0 https:,','stec ne azureedge net,'reposltonN00212ti/03592Jindex html# 20/10/2022 1559 OAuth 2.0 Camada de COntrde Serviços Hoje é comum aceitar a autenticação por terceiros, como Google e empresas em que 0 usuário já ocorrendo a solicitação da senha apenas no primeiro acesso. O protocolo por trás desse tipo de comportamento é chamado de OAuth 2.0, relacionado à autenticação, com envio de dados do usuário de forma padronizada, segundo o padrão OIDC (Open Id Connect). Os papéis definidos no OAuth 2.0 são: cliente,
Compartilhar