Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Princípios Básicos do REST | API Restful
Spring Boot Backend

bookPrincípios Básicos do REST

Os princípios fundamentais do REST formam a base para a criação de serviços web eficazes e facilmente escaláveis. No Spring Boot, eles são frequentemente utilizados para implementar APIs.

Vamos explorar quais são esses princípios, por que são importantes e analisar exemplos de sua aplicação no Spring Boot.

Princípios Fundamentais do REST

REST (Representational State Transfer) é um estilo arquitetural baseado em seis princípios-chave que auxiliam desenvolvedores a construir APIs simples, flexíveis e escaláveis. Esses princípios descrevem como os sistemas devem interagir para permanecerem adaptáveis e manuteníveis.

Arquitetura Cliente-Servidor

Uma API REST deve separar as responsabilidades entre o cliente e o servidor. O cliente é responsável pela interface do usuário e realização de requisições, enquanto o servidor gerencia o armazenamento de dados e o processamento das requisições.

A API REST garante uma separação clara entre o lado do cliente e o lado do servidor da aplicação, permitindo que evoluam independentemente.

O lado do cliente pode ser um navegador web, aplicativo móvel ou qualquer outra aplicação cliente, enquanto o lado do servidor pode ser implementado em qualquer linguagem de programação.

Stateless

Cada requisição do cliente para o servidor deve incluir todas as informações necessárias para processar essa requisição. O servidor não deve manter nenhum estado entre as requisições, garantindo que cada requisição seja isolada das demais.

Por exemplo, considere uma aplicação que retorna uma lista de produtos em diferentes idiomas. O cliente deve incluir a informação de idioma em cada requisição para que o servidor saiba qual idioma utilizar na resposta. O servidor não armazena a informação de idioma entre as requisições. Vamos implementar este exemplo em código.

Main.java

Main.java

copy
12345678910111213141516
@RestController @RequestMapping("/products") public class ProductController { @GetMapping public List<Product> getProducts(@RequestParam("lang") String language) { // Check the language requested by the client if ("en".equals(language)) { return productService.getProductsInEnglish(); } else if ("es".equals(language)) { return productService.getProductsInSpanish(); } else { return productService.getProductsInDefaultLanguage(); } } }

Este código representa um controlador REST que trata requisições HTTP GET no endpoint /products. O método getProducts() recebe um parâmetro lang, indicando o idioma no qual o cliente deseja receber os dados.

Com base nesse parâmetro, o método retorna uma lista de produtos no idioma especificado ou no idioma padrão.

Interface Uniforme

Para tornar uma API REST fácil de utilizar, ela deve possuir uma estrutura simples e organizada. Isso significa que todos os endpoints precisam seguir algumas diretrizes básicas. Abaixo estão os princípios-chave:

Utilizar substantivos para representar recursos em vez de verbos. Por exemplo, ao invés de usar GET /createProduct, é preferível utilizar POST /products, onde products é o recurso.

GET /productsRecupera uma lista de produtos;

POST /productsCria um novo produto;

PUT /products/{id}Atualiza informações sobre um produto específico, onde {id} é o identificador único do produto;

DELETE /products/{id}Remove o produto com o identificador especificado.

Descrição de um controlador REST do Spring que gerencia produtos implementando diversos métodos HTTP para criação, recuperação, atualização e remoção de dados de produto, seguindo as melhores práticas para uma estrutura de API de fácil utilização.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
@RestController @RequestMapping("/products") public class ProductController { // Example of applying the client-server architecture principle private final ProductService productService; // Constructor injection ensures productService is provided by Spring public ProductController(ProductService productService) { this.productService = productService; } // Uniform interface principle: GET request to retrieve all products @GetMapping public List<Product> getAllProducts() { // Calls the service to return a list of all products return productService.getAllProducts(); } // Uniform interface principle: POST request to create a new product @PostMapping public Product createProduct(@RequestBody Product product) { // Calls the service to create a new product based on the provided request body return productService.createProduct(product); } // Uniform interface principle: GET request to retrieve a product by its ID @GetMapping("/{id}") public Product getProductById(@PathVariable Long id) { // Calls the service to find and return the product with the given ID return productService.getProductById(id); } // Uniform interface principle: PUT request to update a product by its ID @PutMapping("/{id}") public Product updateProduct(@PathVariable Long id, @RequestBody Product product) { // Calls the service to update the product details based on the provided request body and ID return productService.updateProduct(id, product); } // Uniform interface principle: DELETE request to remove a product by its ID @DeleteMapping("/{id}") public void deleteProduct(@PathVariable Long id) { // Calls the service to delete the product with the specified ID productService.deleteProduct(id); } }

A anotação @RequestMapping("/products") especifica que a URL base /products será automaticamente prefixada a todas as rotas dentro deste controller.

Neste exemplo, o controller lida com operações relacionadas à entidade Product (classe Product), portanto a URL base é /products. Essa abordagem evita a repetição de /products para cada método. Em vez disso, basta especificar os métodos HTTP (GET, POST, PUT, DELETE), que serão aplicados a essa URL base.

GET /productsRecupera uma lista de produtos;

POST /productsCria um novo produto.

Podemos ter múltiplos endpoints com a mesma URL, mas com métodos HTTP diferentes. Por exemplo, GET /products e POST /products compartilham a mesma URL, mas utilizam métodos HTTP distintos. O cliente especifica o método HTTP no cabeçalho da requisição, indicando qual ação deve ser realizada.

Cache

Para melhorar o desempenho, o servidor pode instruir o cliente sobre quando armazenar dados em cache. Isso reduz a carga do servidor e acelera o processamento das requisições.

Isso significa que, quando o método é chamado com os mesmos parâmetros, o resultado será recuperado do cache em vez de executar novamente o método. Isso pode aumentar o desempenho ao reduzir a carga sobre o serviço.

No Spring Boot, o cache de respostas pode ser gerenciado utilizando anotações ou cabeçalhos HTTP. Veja um exemplo de cache de dados:

Main.java

Main.java

copy
12345
@Cacheable("products") @GetMapping public List<Product> getAllProducts() { return productService.getAllProducts(); }

Neste exemplo, a anotação @Cacheable é utilizada para armazenar em cache o resultado do método getAllProducts().

A anotação @Cacheable("products") indica que o resultado do método getAllProducts() será armazenado no cache sob o nome products. Quando o método for chamado novamente com os mesmos parâmetros, o Spring irá buscar o resultado no cache products ao invés de executar o método novamente.

Sistema em Camadas

O princípio do sistema em camadas em uma API REST significa que o cliente não interage apenas com um servidor; em vez disso, ele opera por meio de vários níveis. Vamos explicar isso utilizando a arquitetura de três camadas no Spring Boot.

Quando o cliente envia uma requisição, ela percorre todos os três níveis: do controller para o service, depois para o repository e retorna. Essa separação ajuda a manter o sistema organizado e facilita a manutenção do código.

Código sob Demanda

Embora seja menos comum, uma API REST pode retornar código executável para o cliente executar do seu lado. Este princípio é raramente aplicado e exige medidas de segurança adicionais.

Por exemplo, uma API pode retornar código JavaScript que é executado no navegador do cliente para processar dados ou realizar outras tarefas. Isso pode ser útil para carregar funcionalidades dinamicamente com base em requisições, como manipulação de formulários ou validação de dados no lado do cliente.

Resumo

Os princípios fundamentais do REST são diretrizes essenciais para criação de APIs flexíveis e manuteníveis. No Spring Boot, esses princípios são implementados utilizando anotações como @RestController, @Cacheable, que facilitam o desenvolvimento de sistemas bem estruturados e eficientes para interação com clientes.

1. Qual princípio do REST permite que o cliente interaja com um recurso utilizando métodos padrão do HTTP?

2. O que significa o princípio de ausência de estado em REST?

question mark

Qual princípio do REST permite que o cliente interaja com um recurso utilizando métodos padrão do HTTP?

Select the correct answer

question mark

O que significa o princípio de ausência de estado em REST?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 2

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Suggested prompts:

Can you explain each of the six REST principles in more detail?

How does Spring Boot help implement these REST principles?

Can you provide more examples of RESTful endpoints in Spring Boot?

Awesome!

Completion rate improved to 3.45

bookPrincípios Básicos do REST

Deslize para mostrar o menu

Os princípios fundamentais do REST formam a base para a criação de serviços web eficazes e facilmente escaláveis. No Spring Boot, eles são frequentemente utilizados para implementar APIs.

Vamos explorar quais são esses princípios, por que são importantes e analisar exemplos de sua aplicação no Spring Boot.

Princípios Fundamentais do REST

REST (Representational State Transfer) é um estilo arquitetural baseado em seis princípios-chave que auxiliam desenvolvedores a construir APIs simples, flexíveis e escaláveis. Esses princípios descrevem como os sistemas devem interagir para permanecerem adaptáveis e manuteníveis.

Arquitetura Cliente-Servidor

Uma API REST deve separar as responsabilidades entre o cliente e o servidor. O cliente é responsável pela interface do usuário e realização de requisições, enquanto o servidor gerencia o armazenamento de dados e o processamento das requisições.

A API REST garante uma separação clara entre o lado do cliente e o lado do servidor da aplicação, permitindo que evoluam independentemente.

O lado do cliente pode ser um navegador web, aplicativo móvel ou qualquer outra aplicação cliente, enquanto o lado do servidor pode ser implementado em qualquer linguagem de programação.

Stateless

Cada requisição do cliente para o servidor deve incluir todas as informações necessárias para processar essa requisição. O servidor não deve manter nenhum estado entre as requisições, garantindo que cada requisição seja isolada das demais.

Por exemplo, considere uma aplicação que retorna uma lista de produtos em diferentes idiomas. O cliente deve incluir a informação de idioma em cada requisição para que o servidor saiba qual idioma utilizar na resposta. O servidor não armazena a informação de idioma entre as requisições. Vamos implementar este exemplo em código.

Main.java

Main.java

copy
12345678910111213141516
@RestController @RequestMapping("/products") public class ProductController { @GetMapping public List<Product> getProducts(@RequestParam("lang") String language) { // Check the language requested by the client if ("en".equals(language)) { return productService.getProductsInEnglish(); } else if ("es".equals(language)) { return productService.getProductsInSpanish(); } else { return productService.getProductsInDefaultLanguage(); } } }

Este código representa um controlador REST que trata requisições HTTP GET no endpoint /products. O método getProducts() recebe um parâmetro lang, indicando o idioma no qual o cliente deseja receber os dados.

Com base nesse parâmetro, o método retorna uma lista de produtos no idioma especificado ou no idioma padrão.

Interface Uniforme

Para tornar uma API REST fácil de utilizar, ela deve possuir uma estrutura simples e organizada. Isso significa que todos os endpoints precisam seguir algumas diretrizes básicas. Abaixo estão os princípios-chave:

Utilizar substantivos para representar recursos em vez de verbos. Por exemplo, ao invés de usar GET /createProduct, é preferível utilizar POST /products, onde products é o recurso.

GET /productsRecupera uma lista de produtos;

POST /productsCria um novo produto;

PUT /products/{id}Atualiza informações sobre um produto específico, onde {id} é o identificador único do produto;

DELETE /products/{id}Remove o produto com o identificador especificado.

Descrição de um controlador REST do Spring que gerencia produtos implementando diversos métodos HTTP para criação, recuperação, atualização e remoção de dados de produto, seguindo as melhores práticas para uma estrutura de API de fácil utilização.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
@RestController @RequestMapping("/products") public class ProductController { // Example of applying the client-server architecture principle private final ProductService productService; // Constructor injection ensures productService is provided by Spring public ProductController(ProductService productService) { this.productService = productService; } // Uniform interface principle: GET request to retrieve all products @GetMapping public List<Product> getAllProducts() { // Calls the service to return a list of all products return productService.getAllProducts(); } // Uniform interface principle: POST request to create a new product @PostMapping public Product createProduct(@RequestBody Product product) { // Calls the service to create a new product based on the provided request body return productService.createProduct(product); } // Uniform interface principle: GET request to retrieve a product by its ID @GetMapping("/{id}") public Product getProductById(@PathVariable Long id) { // Calls the service to find and return the product with the given ID return productService.getProductById(id); } // Uniform interface principle: PUT request to update a product by its ID @PutMapping("/{id}") public Product updateProduct(@PathVariable Long id, @RequestBody Product product) { // Calls the service to update the product details based on the provided request body and ID return productService.updateProduct(id, product); } // Uniform interface principle: DELETE request to remove a product by its ID @DeleteMapping("/{id}") public void deleteProduct(@PathVariable Long id) { // Calls the service to delete the product with the specified ID productService.deleteProduct(id); } }

A anotação @RequestMapping("/products") especifica que a URL base /products será automaticamente prefixada a todas as rotas dentro deste controller.

Neste exemplo, o controller lida com operações relacionadas à entidade Product (classe Product), portanto a URL base é /products. Essa abordagem evita a repetição de /products para cada método. Em vez disso, basta especificar os métodos HTTP (GET, POST, PUT, DELETE), que serão aplicados a essa URL base.

GET /productsRecupera uma lista de produtos;

POST /productsCria um novo produto.

Podemos ter múltiplos endpoints com a mesma URL, mas com métodos HTTP diferentes. Por exemplo, GET /products e POST /products compartilham a mesma URL, mas utilizam métodos HTTP distintos. O cliente especifica o método HTTP no cabeçalho da requisição, indicando qual ação deve ser realizada.

Cache

Para melhorar o desempenho, o servidor pode instruir o cliente sobre quando armazenar dados em cache. Isso reduz a carga do servidor e acelera o processamento das requisições.

Isso significa que, quando o método é chamado com os mesmos parâmetros, o resultado será recuperado do cache em vez de executar novamente o método. Isso pode aumentar o desempenho ao reduzir a carga sobre o serviço.

No Spring Boot, o cache de respostas pode ser gerenciado utilizando anotações ou cabeçalhos HTTP. Veja um exemplo de cache de dados:

Main.java

Main.java

copy
12345
@Cacheable("products") @GetMapping public List<Product> getAllProducts() { return productService.getAllProducts(); }

Neste exemplo, a anotação @Cacheable é utilizada para armazenar em cache o resultado do método getAllProducts().

A anotação @Cacheable("products") indica que o resultado do método getAllProducts() será armazenado no cache sob o nome products. Quando o método for chamado novamente com os mesmos parâmetros, o Spring irá buscar o resultado no cache products ao invés de executar o método novamente.

Sistema em Camadas

O princípio do sistema em camadas em uma API REST significa que o cliente não interage apenas com um servidor; em vez disso, ele opera por meio de vários níveis. Vamos explicar isso utilizando a arquitetura de três camadas no Spring Boot.

Quando o cliente envia uma requisição, ela percorre todos os três níveis: do controller para o service, depois para o repository e retorna. Essa separação ajuda a manter o sistema organizado e facilita a manutenção do código.

Código sob Demanda

Embora seja menos comum, uma API REST pode retornar código executável para o cliente executar do seu lado. Este princípio é raramente aplicado e exige medidas de segurança adicionais.

Por exemplo, uma API pode retornar código JavaScript que é executado no navegador do cliente para processar dados ou realizar outras tarefas. Isso pode ser útil para carregar funcionalidades dinamicamente com base em requisições, como manipulação de formulários ou validação de dados no lado do cliente.

Resumo

Os princípios fundamentais do REST são diretrizes essenciais para criação de APIs flexíveis e manuteníveis. No Spring Boot, esses princípios são implementados utilizando anotações como @RestController, @Cacheable, que facilitam o desenvolvimento de sistemas bem estruturados e eficientes para interação com clientes.

1. Qual princípio do REST permite que o cliente interaja com um recurso utilizando métodos padrão do HTTP?

2. O que significa o princípio de ausência de estado em REST?

question mark

Qual princípio do REST permite que o cliente interaja com um recurso utilizando métodos padrão do HTTP?

Select the correct answer

question mark

O que significa o princípio de ausência de estado em REST?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 2
some-alt