Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Principios Básicos de REST | API RESTful
Spring Boot Backend

bookPrincipios Básicos de REST

Los principios fundamentales de REST constituyen la base para crear servicios web eficaces y fácilmente escalables. En Spring Boot, se utilizan frecuentemente para implementar APIs.

A continuación, se presentan estos principios, su importancia y ejemplos de su aplicación en Spring Boot.

Principios Fundamentales de REST

REST (Representational State Transfer) es un estilo arquitectónico basado en seis principios clave que ayudan a los desarrolladores a construir APIs simples, flexibles y escalables. Estos principios describen cómo deben interactuar los sistemas para mantenerse adaptables y mantenibles.

Arquitectura Cliente-Servidor

Una API REST debe separar las responsabilidades entre el cliente y el servidor. El cliente se encarga de la interfaz de usuario y de realizar solicitudes, mientras que el servidor gestiona el almacenamiento de datos y el procesamiento de solicitudes.

La API REST garantiza una separación clara entre el lado del cliente y el lado del servidor de la aplicación, permitiendo que ambos evolucionen de forma independiente.

El lado del cliente puede ser un navegador web, una aplicación móvil o cualquier otra aplicación cliente, mientras que el lado del servidor puede implementarse en cualquier lenguaje de programación.

Sin estado

Cada solicitud del cliente al servidor debe incluir toda la información necesaria para procesar esa solicitud. El servidor no debe mantener ningún estado entre solicitudes, asegurando que cada solicitud esté aislada de las demás.

Por ejemplo, supongamos que tenemos una aplicación que devuelve una lista de productos en diferentes idiomas. El cliente debe incluir la información del idioma en cada solicitud para que el servidor sepa qué idioma utilizar en la respuesta. El servidor no almacena la información del idioma entre solicitudes. Vamos a implementar este ejemplo en 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 un controlador REST que gestiona solicitudes HTTP GET en el endpoint /products. El método getProducts() recibe un parámetro lang, que indica el idioma en el que el cliente desea recibir los datos.

En función de este parámetro, el método devuelve una lista de productos en el idioma especificado o en el idioma predeterminado.

Interfaz uniforme

Para que una API REST sea fácil de usar, debe tener una estructura simple y organizada. Esto significa que todos los endpoints deben seguir algunas directrices básicas. A continuación se presentan los principios clave:

Utilizar sustantivos para representar recursos en lugar de verbos. Por ejemplo, en vez de usar GET /createProduct, es preferible usar POST /products, donde products es el recurso.

GET /productsRecupera una lista de productos;

POST /productsCrea un nuevo producto;

PUT /products/{id}Actualiza la información de un producto específico, donde {id} es el identificador único del producto;

DELETE /products/{id}Elimina el producto con el identificador especificado.

Descripción de un controlador REST de Spring que gestiona productos implementando varios métodos HTTP para crear, recuperar, actualizar y eliminar datos de productos, siguiendo las mejores prácticas para una estructura de API fácil de usar.

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); } }

La anotación @RequestMapping("/products") especifica que la URL base /products será agregada automáticamente como prefijo a todas las rutas dentro de este controlador.

En este ejemplo, el controlador gestiona operaciones relacionadas con la entidad Product (clase Product), por lo que la URL base es /products. Este enfoque evita repetir /products en cada método. En su lugar, simplemente se especifican los métodos HTTP (GET, POST, PUT, DELETE), que serán aplicados a esta URL base.

GET /productsRecupera una lista de productos;

POST /productsCrea un nuevo producto.

Podemos tener múltiples endpoints con la misma URL pero diferentes métodos HTTP. Por ejemplo, GET /products y POST /products comparten la misma URL, pero utilizan métodos HTTP diferentes. El cliente especificará el método HTTP en el encabezado de la solicitud, indicando qué acción realizar.

Caché

Para mejorar el rendimiento, el servidor puede indicar al cliente cuándo almacenar datos en caché. Esto reduce la carga del servidor y acelera el procesamiento de solicitudes.

Esto significa que cuando se llama al método con los mismos parámetros, el resultado se recuperará de la caché en lugar de volver a ejecutar el método. Esto puede mejorar el rendimiento al reducir la carga sobre el servicio.

En Spring Boot, las respuestas en caché pueden gestionarse utilizando anotaciones o encabezados HTTP. Aquí tienes un ejemplo de almacenamiento en caché de datos:

Main.java

Main.java

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

En este ejemplo, la anotación @Cacheable se utiliza para almacenar en caché el resultado del método getAllProducts().

La anotación @Cacheable("products") indica que el resultado del método getAllProducts() se guardará en la caché bajo el nombre products. Cuando el método se llame nuevamente con los mismos parámetros, Spring buscará el resultado en la caché products en lugar de ejecutar el método otra vez.

Sistema en capas

El principio de sistema en capas en una API REST significa que el cliente no interactúa solo con un servidor; en cambio, opera a través de varios niveles. Expliquemos esto utilizando la arquitectura de tres capas en Spring Boot.

Cuando el cliente envía una solicitud, esta pasa por los tres niveles: desde el controlador al servicio, luego al repositorio, y regresa. Esta separación ayuda a mantener el sistema organizado y facilita el mantenimiento del código.

Código bajo demanda

Aunque se utiliza con menos frecuencia, una API REST puede devolver código ejecutable al cliente para su ejecución en su lado. Este principio se aplica raramente y requiere medidas de seguridad adicionales.

Por ejemplo, una API podría devolver código JavaScript que se ejecuta en el navegador del cliente para procesar datos o realizar otras tareas. Esto puede ser útil para cargar funcionalidad dinámicamente según las solicitudes, como el manejo de formularios o la validación de datos en el lado del cliente.

Resumen

Los principios fundamentales de REST son pautas esenciales para crear APIs flexibles y mantenibles. En Spring Boot, estos principios se implementan utilizando anotaciones como @RestController, @Cacheable, que facilitan el desarrollo de sistemas bien estructurados y eficientes para interactuar con los clientes.

1. ¿Qué principio de REST permite que el cliente interactúe con un recurso utilizando métodos estándar de HTTP?

2. ¿Qué significa el principio de ausencia de estado en REST?

question mark

¿Qué principio de REST permite que el cliente interactúe con un recurso utilizando métodos estándar de HTTP?

Select the correct answer

question mark

¿Qué significa el principio de ausencia de estado en REST?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 2

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Awesome!

Completion rate improved to 3.45

bookPrincipios Básicos de REST

Desliza para mostrar el menú

Los principios fundamentales de REST constituyen la base para crear servicios web eficaces y fácilmente escalables. En Spring Boot, se utilizan frecuentemente para implementar APIs.

A continuación, se presentan estos principios, su importancia y ejemplos de su aplicación en Spring Boot.

Principios Fundamentales de REST

REST (Representational State Transfer) es un estilo arquitectónico basado en seis principios clave que ayudan a los desarrolladores a construir APIs simples, flexibles y escalables. Estos principios describen cómo deben interactuar los sistemas para mantenerse adaptables y mantenibles.

Arquitectura Cliente-Servidor

Una API REST debe separar las responsabilidades entre el cliente y el servidor. El cliente se encarga de la interfaz de usuario y de realizar solicitudes, mientras que el servidor gestiona el almacenamiento de datos y el procesamiento de solicitudes.

La API REST garantiza una separación clara entre el lado del cliente y el lado del servidor de la aplicación, permitiendo que ambos evolucionen de forma independiente.

El lado del cliente puede ser un navegador web, una aplicación móvil o cualquier otra aplicación cliente, mientras que el lado del servidor puede implementarse en cualquier lenguaje de programación.

Sin estado

Cada solicitud del cliente al servidor debe incluir toda la información necesaria para procesar esa solicitud. El servidor no debe mantener ningún estado entre solicitudes, asegurando que cada solicitud esté aislada de las demás.

Por ejemplo, supongamos que tenemos una aplicación que devuelve una lista de productos en diferentes idiomas. El cliente debe incluir la información del idioma en cada solicitud para que el servidor sepa qué idioma utilizar en la respuesta. El servidor no almacena la información del idioma entre solicitudes. Vamos a implementar este ejemplo en 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 un controlador REST que gestiona solicitudes HTTP GET en el endpoint /products. El método getProducts() recibe un parámetro lang, que indica el idioma en el que el cliente desea recibir los datos.

En función de este parámetro, el método devuelve una lista de productos en el idioma especificado o en el idioma predeterminado.

Interfaz uniforme

Para que una API REST sea fácil de usar, debe tener una estructura simple y organizada. Esto significa que todos los endpoints deben seguir algunas directrices básicas. A continuación se presentan los principios clave:

Utilizar sustantivos para representar recursos en lugar de verbos. Por ejemplo, en vez de usar GET /createProduct, es preferible usar POST /products, donde products es el recurso.

GET /productsRecupera una lista de productos;

POST /productsCrea un nuevo producto;

PUT /products/{id}Actualiza la información de un producto específico, donde {id} es el identificador único del producto;

DELETE /products/{id}Elimina el producto con el identificador especificado.

Descripción de un controlador REST de Spring que gestiona productos implementando varios métodos HTTP para crear, recuperar, actualizar y eliminar datos de productos, siguiendo las mejores prácticas para una estructura de API fácil de usar.

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); } }

La anotación @RequestMapping("/products") especifica que la URL base /products será agregada automáticamente como prefijo a todas las rutas dentro de este controlador.

En este ejemplo, el controlador gestiona operaciones relacionadas con la entidad Product (clase Product), por lo que la URL base es /products. Este enfoque evita repetir /products en cada método. En su lugar, simplemente se especifican los métodos HTTP (GET, POST, PUT, DELETE), que serán aplicados a esta URL base.

GET /productsRecupera una lista de productos;

POST /productsCrea un nuevo producto.

Podemos tener múltiples endpoints con la misma URL pero diferentes métodos HTTP. Por ejemplo, GET /products y POST /products comparten la misma URL, pero utilizan métodos HTTP diferentes. El cliente especificará el método HTTP en el encabezado de la solicitud, indicando qué acción realizar.

Caché

Para mejorar el rendimiento, el servidor puede indicar al cliente cuándo almacenar datos en caché. Esto reduce la carga del servidor y acelera el procesamiento de solicitudes.

Esto significa que cuando se llama al método con los mismos parámetros, el resultado se recuperará de la caché en lugar de volver a ejecutar el método. Esto puede mejorar el rendimiento al reducir la carga sobre el servicio.

En Spring Boot, las respuestas en caché pueden gestionarse utilizando anotaciones o encabezados HTTP. Aquí tienes un ejemplo de almacenamiento en caché de datos:

Main.java

Main.java

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

En este ejemplo, la anotación @Cacheable se utiliza para almacenar en caché el resultado del método getAllProducts().

La anotación @Cacheable("products") indica que el resultado del método getAllProducts() se guardará en la caché bajo el nombre products. Cuando el método se llame nuevamente con los mismos parámetros, Spring buscará el resultado en la caché products en lugar de ejecutar el método otra vez.

Sistema en capas

El principio de sistema en capas en una API REST significa que el cliente no interactúa solo con un servidor; en cambio, opera a través de varios niveles. Expliquemos esto utilizando la arquitectura de tres capas en Spring Boot.

Cuando el cliente envía una solicitud, esta pasa por los tres niveles: desde el controlador al servicio, luego al repositorio, y regresa. Esta separación ayuda a mantener el sistema organizado y facilita el mantenimiento del código.

Código bajo demanda

Aunque se utiliza con menos frecuencia, una API REST puede devolver código ejecutable al cliente para su ejecución en su lado. Este principio se aplica raramente y requiere medidas de seguridad adicionales.

Por ejemplo, una API podría devolver código JavaScript que se ejecuta en el navegador del cliente para procesar datos o realizar otras tareas. Esto puede ser útil para cargar funcionalidad dinámicamente según las solicitudes, como el manejo de formularios o la validación de datos en el lado del cliente.

Resumen

Los principios fundamentales de REST son pautas esenciales para crear APIs flexibles y mantenibles. En Spring Boot, estos principios se implementan utilizando anotaciones como @RestController, @Cacheable, que facilitan el desarrollo de sistemas bien estructurados y eficientes para interactuar con los clientes.

1. ¿Qué principio de REST permite que el cliente interactúe con un recurso utilizando métodos estándar de HTTP?

2. ¿Qué significa el principio de ausencia de estado en REST?

question mark

¿Qué principio de REST permite que el cliente interactúe con un recurso utilizando métodos estándar de HTTP?

Select the correct answer

question mark

¿Qué significa el principio de ausencia de estado en REST?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 2
some-alt