El artículo de hoy cubrirá las preguntas básicas sobre REST en primavera. Será especialmente útil para programadores novatos.
La guía oficial de Pivotal, que dice sobre temas para la preparación.

Spring REST es parte de Spring MVC. Por lo tanto, gran parte de Spring MVC se utilizará en REST y viceversa. Para una mirada más profunda a Spring MVC, lea este artículo .
¿Para qué se creó REST?Para comprender el concepto de REST, debe analizar el acrónimo en sus componentes:
- Representacional: los recursos en REST se pueden representar en cualquier forma (JSON, XML, texto o incluso HTML) depende de qué datos sean más adecuados para el consumidor
- Estado: cuando trabaje con REST, debe centrarse en el estado del recurso y no en las acciones con el recurso
- Transferencia: REST incluye la transferencia de datos de recursos, en cualquier forma presentada, de una aplicación a otra.
REST es la transferencia de estados de recursos entre un servidor y un cliente.
¿Qué es un recurso?Un recurso en REST es todo lo que se puede transferir entre un cliente y un servidor.
Aquí hay algunos ejemplos de recursos:
- Noticias
- Temperatura en San Petersburgo el lunes a las 4 a.m.
- Salario del empleado
- Selección de base de datos
- Resultado de busqueda
¿Qué significa CRUD?Las acciones en REST se determinan por métodos http.
Get
, Post
, Put
, Delete
, Patch
y otros.
Los más utilizados se denotan con el acrónimo CRUD:
- Crear -
POST
- Leer -
GET
- Actualización -
PUT
- Eliminar -
DELETE
¿REST es seguro? ¿Cómo puedes protegerlo?Por defecto, REST no es seguro.
Puede configurar la seguridad con Basic Auth, JWT, OAuth2
.
¿Qué es guardar operaciones?Estas son operaciones que no modifican los recursos. Aquí hay una lista de ellos:
¿Qué es una operación idempotente? ¿Por qué es importante la idempotencia?Los métodos idempotentes son métodos con cada invocación cuyo resultado será el mismo.
Es decir, el resultado después de 1 llamada de dicho método será el mismo que el resultado después de 10 llamadas de este método.
Esto es importante para una API tolerante a fallas. ¿Y si un cliente desea actualizar un recurso utilizando una solicitud POST? Si POST no es un método idempotente, una llamada múltiple provocará actualizaciones inesperadas de recursos. Usando métodos idempotentes, te proteges de muchos errores.
¿REST escala bien?Si REST escala bien porque no almacena el estado.
Esto significa que no almacena información de la sesión del usuario en el servidor.
La información del cliente no debe almacenarse en el lado del servidor, sino que debe transmitirse cada vez que sea necesario. Esto es lo que significa ST en REST, Transferencia de estado. Pasa el estado, no lo almacena en el servidor.
REST también es interoperable, esto significa que diferentes programas escritos en diferentes idiomas pueden interactuar en él. Esto viene de 2 factores:
- Clientes HTTP interoperables. Diferentes clientes deben enviar las mismas solicitudes http.
- Interoperabilidad a nivel de tipos de medios. Diferentes clientes deben enviar y recibir correctamente los mismos recursos.
¿Qué es un HttpMessageConverter?HttpMessageConverter
convierte la solicitud en un objeto y viceversa.
Spring tiene varias implementaciones de esta interfaz, y puede crear la suya propia.
En este caso, DispatcherServlet
no usa Model and View.
En REST, Model y View no existen en absoluto. Solo existen los datos suministrados por el controlador y la representación del recurso cuando el mensaje se convierte de un tipo de medio (json, xml ...) en un objeto.
Lista de convertidores:
BufferedImageHttpMessageConverter
- Convierte una BufferedImage
a (desde) código de imagen.
Jaxb2RootElementHttpMessageConverter
: convierte xml a (desde) un objeto marcado con anotaciones jaxb2. Regístrese si jaxb2 está en classpath.
MappingJackson2HttpMessageConverter
: convierte JSON a (desde) un objeto. Regístrese si Jackson 2 está en el classpath.
StringHttpMessageConverter
: convierte todos los archivos multimedia a texto / sin formato.
¿Cómo funciona la anotación @RestController?@RestController
se coloca en la clase de controlador en lugar de @Controller
. Ella señala que esta clase no opera en modelos, sino en datos. Consiste en @RequestBody
@Controller
y @RequestBody
.
@Controller @ResponseBody public interface RestController
¿Por qué @ResponseBody?La @ResponseBody
se @ResponseBody
a métodos que funcionan con datos, no con modelos. No necesita especificarse explícitamente si @RestController
utiliza @RestController
.
Los métodos regulares devuelven Model
, y los métodos @ResponseBody
anotados devuelven objetos que se convierten en archivos multimedia utilizando HttpMessageConverter
.
¿Qué hace la anotación @RequestMapping?Esta anotación se utiliza para asignar solicitudes a clases y métodos de controlador.
Anteriormente, se usaba para métodos de clase para indicar el URI, el método http, el tipo de datos enviados, etc. En las versiones más recientes de Spring, se reemplazó con anotaciones @GetMapping
, @PostMapping
, etc.
Ahora se usa solo para indicar el URI a la clase de controlador.
¿Qué son las anotaciones @GetMapping, @PostMapping, @DeleteMapping y otras?Estas son anotaciones más estrechas para mapear métodos http.
@GetMapping
: maneja las solicitudes de obtención@PostMapping
: maneja las solicitudes de publicación@DeleteMapping
: maneja las solicitudes de eliminación@PutMapping
: maneja solicitudes de @PutMapping
@PatchMapping
- Maneja solicitudes de parches
Todo lo escrito a continuación también es característico de otras anotaciones.
Anotación @GetMapping es simplemente una anotación que contiene @RequestMapping (method = RequestMethod.GET) .
También le permite ajustar el método del controlador.
Sus parámetros (se convierten en parámetros @RequestMapping similares):
path
- URIheaders
- encabezadosname
: nombre del controladorparams
- parámetrosproduces
- tipo de datos devueltos (JSON, XML, texto). Utilizado en RESTconsumes
- tipo de datos recibidos. Utilizado en REST
Por defecto, la anotación toma la ruta al método.
@GetMapping("managers") = @GetMapping(path = "managers")
¿Por qué usar la anotación @RequestParam?Esta anotación se utiliza para que los métodos de controlador puedan obtener parámetros de una solicitud http.
Una solicitud con parámetros: http://localhost:8080/getByName/name=Ivan
.
El siguiente código colocará la cadena Ivan
en el name
la variable.
@GetMapping("getByName") public User getUserByName(@RequestParam("name") String name) {
¿Por qué usar la anotación @PathVariable?Esta anotación obtiene una parte específica del URI.
URI: http://localhost:8080/getById/23
El siguiente código colocará 23
en la variable id
.
@GetMapping("getById/{id}") public User getUserById(@PathVariable("id") String id) {
¿Qué significan los diferentes códigos para las respuestas http?OBTENER - 200 OK
POST - 200 OK, 201 Creado, 204 Sin contenido
PUT - 200 OK, 201 Creado, 204 Sin contenido
ELIMINAR - 204 Sin contenido, 202 Aceptados
¿Por qué necesito la anotación @ResponseStatus?Le permite establecer un código de respuesta. Por lo general, Spring establece el código de respuesta deseado, pero hay momentos en los que debe anularlo.
@PostMapping @ResponseStatus(HttpStatus.CREATED) public void add(...) {...}
En lugar de usar anotaciones, puede devolver una ResponseEntity
y establecer manualmente el código de respuesta.
No se recomienda usar ResponseEntity
y @ReponseStatus
juntos.
¿Qué es una entidad de respuesta?Esta es una clase especial que representa una respuesta http. Contiene el cuerpo de respuesta, el código de estado, los encabezados. Podemos usarlo para ajustar la respuesta http.
Es de tipo universal, y cualquier objeto puede usarse como cuerpo:
@GetMapping("/hello") ResponseEntity hello() { return new ResponseEntity("Hello World!", HttpStatus.OK); }
¿Por qué @RequestBody?Puede usar la anotación @RequestBody
en un parámetro de método para que el cuerpo de la solicitud se convierta a este parámetro.
@PostMapping("accounts")
Puede usar @Validated
junto con @RequestBody
para verificar una solicitud.
¿Qué es un RestTemplate? Cuales son sus ventajas?RestTemplate es un cliente especial en Spring para enviar solicitudes http. Proporciona API convenientes para llamar fácilmente puntos finales REST en una sola línea.
RestTemplate restTemplate = new RestTemplate(); String fooResourceUrl = "http://localhost:8080/spring-rest/foos"; ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
Puede obtener más información sobre el uso en este artículo .