La popularidad de la API REST aumenta día a día, ya que cumple con la arquitectura de una aplicación de manera conveniente. Una API REST es un acrónimo de ‘Transferencia de estado representacional’. También se denomina servicios web RESTful. También es un ‘Controlador’, pero con la diferencia de que Rest Controller devuelve Datos, mientras que Controller devuelve una Vista de la arquitectura ‘Modelo-Vista-Controlador’. REST API puede funcionar en todos los métodos HTTP como (GET, POST, PUT, PATCH, DELETE, etc.). Estos métodos corresponden a operaciones de creación, lectura, actualización y eliminación ( CRUD ), respectivamente. Puede devolver muchos tipos de datos. JSON se considera el formulario estándar para la transferencia de datos entre aplicaciones web.
Los tipos de datos que la API REST puede devolver son los siguientes:
- JSON (Notación de objetos de JavaScript)
- XML
- HTML
- XLT
- Python
- PHP
- Texto sin formato
Requisito previo: aunque JSON es la forma estándar para transferir datos entre aplicaciones, tiene algunas desventajas que se superan en la transferencia de datos en formato XML.
Las ventajas de XML son las siguientes:
- Es un lenguaje de marcado extensible que utiliza etiquetas para la definición de datos.
- Admite espacios de nombres.
- Admite comentarios.
- Admite varias codificaciones.
- Por último, pero no menos importante, XML es más seguro que JSON.
Nota :
- JSON es menos seguro debido a la ausencia de un analizador JSON en el navegador.
- JSONP es peligroso porque permite intercambios de datos de origen cruzado.
API REST: respuesta XML
- Cuando creamos un proyecto Spring Boot con la dependencia ‘Starter Web’, solo obtenemos soporte para devolver datos en formato JSON, con la ayuda de la biblioteca Jackson.
- Para incorporar soporte para devolver datos en formato XML, necesitamos dependencias de terceros.
- Hay muchas bibliotecas que admiten el formato de retorno XML, por ejemplo, Jackson, JAXB, etc.
Camino 1: Usando Jackson
La biblioteca Jackson ya está presente en el classpath del framework Spring para nuestra aplicación. Solo necesitamos agregar una extensión a la biblioteca Jackson que pueda funcionar con respuestas de datos XML. Para agregar la extensión, agregue la siguiente dependencia en la compilación del proyecto.
Experto – pom.xml
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
Después de agregar la dependencia anterior y actualizar el proyecto, la extensión XML de Jackson se agregará en la ruta de clase para que Spring MVC la recoja automáticamente para las respuestas XML.
A. Archivo: pom.xml (Configuración del proyecto)
Ejemplo:
XML
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>sia</groupId> <artifactId>GFG-RestXMLResponse</artifactId> <version>0.0.1-SNAPSHOT</version> <name>GFG-RestXMLResponse</name> <description>GeeksforGeeks</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
B. Bootstrapping de la aplicación
Ejemplo: GfgRestXmlResponseApplication.java
Java
// Java Program to Illustrate Bootstrapping of Application package gfg; // Importing required classes import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // Annotation @SpringBootApplication // Class public class GfgRestXmlResponseApplication { // Main driver method public static void main(String[] args) { SpringApplication.run( GfgRestXmlResponseApplication.class, args); } }
C. Objeto a devolver como respuesta XML (EntityModel.java)
Esta clase actúa como un objeto de usuario (bean) cuyos campos se asignarán a etiquetas XML respectivamente. También requiere métodos Getter/Setter que se generan automáticamente usando la anotación ‘@Data’ de la biblioteca ‘Lombok’. Para incrustar la biblioteca de Lombok en el proyecto, agregue la siguiente dependencia en la compilación del proyecto.
Experto – pom.xml
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
Ejemplo:
Java
// Java Program Illustrating Object to be return as XML // response package gfg; // Importing required classes import lombok.Data; // Annotation @Data // Class public class EntityModel { // Class data members String ID; String NAME; String DOB; String PINCODE; }
D. API REST que devuelve una respuesta XML (RestXMLResponseController.java)
Este controlador API REST está configurado para devolver datos específicamente en formato XML, utilizando el atributo Produce de la anotación @RequestMapping.
Ejemplo:
Java
// Java Program Illustrating REST API returning XML response package gfg; // Importing required classes import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; // Annotations @RestController @RequestMapping(path = "/xml-output", produces = "application/xml") // Class public class RestXMLResponseController { @GetMapping("/get") public ResponseEntity<EntityModel> get() { EntityModel model = new EntityModel(); model.setID("1"); model.setNAME("Darshan.G.Pawar"); model.setDOB("05-09-2001"); model.setPINCODE("422 009"); HttpHeaders hearders = new HttpHeaders(); ResponseEntity<EntityModel> entityModel = new ResponseEntity<>(model, hearders, HttpStatus.CREATED); return entityModel; } // Annotation @GetMapping("/get/{id}") // Class public ResponseEntity<EntityModel> getById(@PathVariable("id") String id) { EntityModel model = new EntityModel(); model.setID(id); model.setNAME("Darshan.G.Pawar"); model.setDOB("05-09-2001"); model.setPINCODE("422 009"); HttpHeaders hearders = new HttpHeaders(); ResponseEntity<EntityModel> entityModel = new ResponseEntity<>(model, hearders, HttpStatus.CREATED); return entityModel; } }
Salida 1:
Salida 2:
E. ConsumeXMLResponse.java (Obtenga la respuesta de la API REST)
- Los datos devueltos en formato XML por la API REST deben consumirse y ponerse en uso.
- Spring Framework proporciona una forma conveniente de consumir respuestas REST con la ayuda de ‘RestTemplate’ de Spring.
- Nos beneficia al evitar la necesidad de escribir código repetitivo.
- RestTemplate nos proporciona métodos que son específicos de los métodos HTTP.
- Aquí, para la solicitud GET HTTP, se usa el método ‘getForEntity()’ que acepta la URL para el método @GetMapping, una clase a la que se asignará la respuesta y parámetros de objeto adicionales a la URL.
- Este método devolverá un objeto ResponseEntity<>.
Java
// Java Program Illustrating Getting REST API Response package gfg; // Importing required classes import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; // Class public class ConsumeXMLResponse { RestTemplate rest = new RestTemplate(); public ResponseEntity<EntityModel> get(String id) { return rest.getForEntity("http://localhost:8080/xml-output/get/{id}", EntityModel.class, id); } }
F. Archivo: OutputController.java (controlador normal)
Este controlador MVC usa la clase anterior para obtener la respuesta XML devuelta por la API REST. Además, tras obtener los datos nos devuelve una vista modificada ( View.html)
Ejemplo:
Java
// Java Program to Illustrate Regular controller package gfg; // Importing required classes import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; // Annotation @Controller @RequestMapping("View") // Class public class OutputController { // Annotation @GetMapping("/get/{id}") public String getXMLOutput(@PathVariable("id") String id, Model model) { ConsumeXMLResponse response = new ConsumeXMLResponse(); ResponseEntity<EntityModel> responseEntity = response.get(id); EntityModel entity = responseEntity.getBody(); HttpHeaders headers = responseEntity.getHeaders(); model.addAttribute("xml", entity); model.addAttribute("XMLheaders", headers); return "View"; } }
G. Archivo: View.html (Mostrar la respuesta XML)
HTML
<!DOCTYPE html> <html xmlns = " http://www.w3.org/1999/xhtml " xmlns:th = " http://www.thymeleaf.org " > <head> <title> GeeksforGeeks </title> <style> h2 { width : 200px ; display : inline-block ; text-align :right; } h1 { color : forestgreen ; display : inline-block ; } h3 { width : 650px ; color : forestgreen ; } </style> </head> <body> <h1> Hello Geek : REST XML Response </h1> </br> <h2> Id : </h2> <h1 th:text = " ${xml.ID} " > Replaceable text </h1 > </br> <h2> Name : </h2> <h1 th:text = " ${xml.NAME} " > Replaceable text </h1 > </br> <h2> Date Of Birth : </h2> <h1 th:text = " ${xml.DOB} " > Replaceable text </h1 > </br> <h2> Pincode : </h2> <h1 th:text = " ${xml.PINCODE} " > Replaceable text </h1 > </br> <h4> Headers : </h4> <h3 th:text = " ${XMLheaders} " ></h3> </body> </html>
Producción:
Camino 2: Usando JAXB
Para usar la biblioteca JAXB, agregue la siguiente dependencia en el proyecto construido.
Archivo: Maven – pom.xml
<dependency> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> </dependency>
Para que funcione, debe usar la anotación @XmlRootElement de la misma biblioteca en un objeto que se asignará a la respuesta XML.
Ejemplo: EntityModel.java
Java
package gfg; import javax.xml.bind.annotation.XmlRootElement; import lombok.Data; @XmlRootElement @Data public class EntityModel { String ID; String NAME; String DOB; String PINCODE; }
Nota : también puede usar la dependencia de Jersey para desarrollar API RESTful. La principal ventaja de usarlo es que ya tiene una biblioteca JAX-RS que eventualmente usa bibliotecas JAXB.
Publicación traducida automáticamente
Artículo escrito por pawardarshan461 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA