Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información. Aceptar

Cómo añadir soporte para XML en una API Rest

Luis Miguel López Magaña
Cómo añadir soporte para XML en una API Rest
El reproductor de video será cargado en breves instantes.

Diferencia entre un recurso y la representación de un recurso

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.

Negociado de contenido

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.

Formato por defecto

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.

Formato XML

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.

Jackson XML

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>

Ejemplo práctico

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.

Relacionado

Te dejamos una selección de cursos, carreras y artículos

Curso de Spring Core 5

Curso de Spring Core 5

curso

Con este curso aprenderás:

  • Conocer los patrones de diseño más usados en aplicaciones empresariales.
  • Conocerás qué es Spring y cuales son los módulos que conforman esta tecnología.
  • Uso los mecanismos de inversión de control e inyección de dependencias.

Duración: 4 horas y 7 minutos

Curso de desarrollo de una API REST con Spring Boot

Curso de desarrollo de una API REST con Spring Boot

curso

Con este curso aprenderás:

  • Conocerás las características de la arquitectura REST.
  • Aprenderás a generar un proyecto de Spring Boot para una API REST.
  • Utilizarás librerías como Lombok.

Duración: 4 horas y 34 minutos

Estas son algunas de las empresas que ya confían en OpenWebinars

Profesores y profesionales

Nuestros docentes son profesionales que trabajan día a día en la materia que imparten

Conviértete en profesor de OpenWebinars