Curso de Spring Core
Aprende con el curso de Spring Core 5 a utilizar el motor de Spring para crear las mejores...
Si quieres aprender cómo añadir soporte para trabajar con XML en tu API REST, además de trabajar con JSON, puedes hacerlo en este artículo, dónde se explica de forma teórica y práctica.
Para aprender cómo añadir soporte para XML en nuestra API REST, debemos comenzar explicando la diferencia entre un recurso y la representación de un recurso.
La arquitectura REST se basa en definir la exposición de los elementos que manejemos dentro de nuestra aplicación como recursos, en lugar de hablar de servicios, que sería más un tipo de arquitectura RPC.
En lugar de pensar en un servicio que nos devuelva un listado de personas, por ejemplo, hablaríamos del recurso “personas” o del recurso “productos” o del recurso “facturas”.
Una cosa es el recurso en sí, que podría ser un listado de elementos de tipo “producto” o “personas”, y otra cosa es la representación que le podamos dar, porque ese mismo recurso lo podríamos presentar en diferentes formatos.
Tenemos el formato JSON, que se saca de la notación que utiliza JavaScript para definir objetos. Podríamos utilizar también XML, que es un lenguaje de marcas con bastante solera. Incluso podríamos querer obtener ese recurso con una representación también en HTML.
En el marco del protocolo HTTP tenemos un proceso que es el negociado de contenido, que consiste en que, al realizar una petición desde un cliente a un servidor, se puede negociar entre ambas partes el formato de la representación del recurso que se envía o del que se quiere recibir.
Todo ello se hace gestionando determinadas cabeceras:
Accept
: indica, desde el cliente al servidor, el tipo de dato que espera en la respuesta.
Content-Type
: indica, desde el cliente al servidor, el contenido del cuerpo de la petición que se está realizando.
Cuando estamos trabajando con una API REST desarrollada con Spring Boot, por defecto, Spring trabaja JSON.
Esto es debido a que dentro de una de esas dependencias transitivas que tenemos, una de las que se incluye es Jackson 2, y como Spring Boot detecta la misma en el classpath, lo que hace es incorporarlo como un conversor en las peticiones HTTP, tanto petición como respuesta.
Por este motivo, siempre que se lo demandemos, siempre que algún método de un controlador esté anotado con @ResponseBody
o todo el controlador está anotado con @RestController
por defecto, si se devuelve algo, se hará en JSON.
Igualmente, si recibimos en algún controlador alguna petición y viene acompañada con @RequestBody
lo que hará será esperar un JSON para transformarlo en un objeto Java.
Si le indicamos otro tipo de dato, obtendremos un error 406, porque no es aceptable el tipo de dato indicado, ya que no entiende qué es lo que le estamos pidiendo.
Para poder atender a esa petición en ese negociado de contenido que nos lo solicita en formato XML, necesitamos convertir nuestras clases en XML para dar una respuesta, o si fuera una petición, por ejemplo, POST o PUT, que fuéramos capaces de procesar un XML para convertir un objeto Java.
Tenemos diferentes alternativas para ello:
JAXB: es el propio estándar que tiene Java para trabajar con XML, pero que nos obligaría a añadir, complementariamente a las anotaciones que ya tenemos, nuevas anotaciones sobre nuestras clases.
Jackson XML: nos permite, añadiendo solamente una nueva dependencia, la posibilidad de transformar a XML, sin tener que tocar las clases, modelos y DTOs que estábamos transformando, desde o hacia JSON.
La dependencia es sencilla, y sería complementaria a la dependencia Jackson que ya se incluye automáticamente cuando trabajamos con un proyecto de Spring Boot y hemos añadido la dependencia web.
Si la añadimos vamos a poder ver como en lugar de obtener un error 406, vamos a tener un procesamiento en XML y eso es lo que obtendríamos como resultado.
La dependencia Jackson XML es la siguiente:
<dependency>
<groupId> com.fasterxml.jackson.dataformat</groupId>
<artifact>Jackson-dataformat-xml</artifact>
</dependency>
En el video puedes ver, paso a paso, cómo añadir la dependencia Jackson XML y cómo realizar una petición solicitando que el contenido aceptado sea en XML para obtener el resultado formateado en este formato.
Sin hacer ningún cambio en el modelo y sin añadir ninguna anotación, tan solo añadiendo este complemento Jackson, que por defecto está incluido en Spring Boot cuando añadimos la dependencia web, podemos hacer este negociado de contenido en XML y de una forma bastante sencilla.
También te puede interesar
Aprende con el curso de Spring Core 5 a utilizar el motor de Spring para crear las mejores...
Con este curso de Spring Boot y Spring MVC online y en español aprenderás a desarrollar tus propias...
Aprende con este curso a desarrollar una API REST utilizando para ello Spring Boot, desde cero hasta la...