Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

Buenas prácticas

Para crear nuestros servicios REST debemos seguir las buenas prácticas que están definidas en esta página de la wiki: Buenas prácticas con servicios REST

Controlador REST en Spring Boot

En Spring Boot, las peticiones HTTP se gestionan por medio de controladores. En nuestro caso la clase que hará de controlador REST deberá estar precedida por la anotación @RestController.

...

Bloque de código
languagejava
package com.example.restservice;
 
import java.util.concurrent.atomic.AtomicLong;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class GreetingController {
 
	private static final String template = "Hello, %s!";
	private final AtomicLong counter = new AtomicLong();
 
	@GetMapping("/greeting")
	public ResponseEntity<Greeting> greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
		Greeting greeting = new Greeting(counter.incrementAndGet(), String.format(template, name));
                return new ResponseEntity<>(greeting, HttpStatus.OK);
	}
}

Parámetros en la URL

@PathVariable

Para añadir parámetros en la ruta de la petición, tenemos dos opciones. En primer lugar, tenemos PathVariable. Cuando especifiquemos la ruta, pondremos entre corchetes estas variables, y como parámetro del método Java lo especificaremos con el mismo nombre, precedido de la anotación @PathVariable:

...

Bloque de código
http://localhost:8080/titulaciones/12312300A

@RequestParam

La otra opción es RequestParam, que funciona de manera similar, pero sólo se indica en los parámetros de la función Java. Si queremos que sea obligatorio incluir esa variable en la petición, pondremos required = true:

...

Estos parámetros irán después de ?, y si tenemos varios los separaremos con &.

Métodos REST con mismo nombre pero diferentes parámetros

Podemos definir diferentes métodos Java con la misma ruta de método REST, pero con diferentes @RequestParam. Para ello, no nos vale sólo con tener diferentes argumentos, hay que indicarlos dentro de la anotación @GetMapping, con params, y tendremos que tener la ruta en value:

...

De este modo podemos evitar tener métodos Java excesivamente largos por tener que comprobar diferentes parámetros y ejecutar el código correspondiente.

Headers de la petición: @RequestHeader

Para utilizar los valores de los headers de la petición, disponemos de la anotación @RequestHeader. Dentro de ésta pondremos el nombre del header en value, y podemos especificar si es obligatorio que se incluya dicho header con required. Por ejemplo, podemos utilizarlo para obtener el token de autenticación:

Bloque de código
languagejava
@GetMapping( "/dniAlumno" )
public ResponseEntity<String> dniAlumno( @RequestHeader( value = "auth-token", required = true ) String tokenCodificado ) {
	final Claims claims = jwtTokenUtil.comprobarToken( tokenCodificado );
	if(claims == null)
		return null;
 
	return new ResponseEntity<>(alumnoTitulacionRepository.findDni( claims.getSubject() ), HttpStatus.OK);
}

Datos en el body: @RequestBody

En caso de que hagamos un post, el cuerpo del mensaje se especificará con ''@RequestBody'':

...

La respuesta que se enviará a la petición, si la hay, será el objeto, con sus atributos y valores, automáticamente en formato JSON.

Devolver ResponseEntity o ResponseStatusException

En los métodos en los que devolvamos datos, si se devuelven los datos correctamente devolveremos objetos tipo ResponseEntity. Este tipo nos da más flexibilidad, permitiendo modificar la respuesta HTTP entera, controlando el código que se devuelve, los headers y los datos del body.

...

Bloque de código
languagejava
} catch (Exception e) {
    throw new ResponseStatusException( HttpStatus.FORBIDDEN, "FORBIDDEN con ResponseStatusException", e);
}

Devolver diferentes propiedades

La primera opción que tenemos para personalizar la respuesta es la anotación @JsonIgnore que le podemos poner a los getters. Con ella, esa propiedad directamente no se incluirá en el JSON de respuesta. Si lo que queremos es devolver propiedades según la ocasión, podemos hacer uso de las vistas.

...

Más información sobre las Views aquí.

Cliente en Spring Boot

Para consumir otro servicio REST desde el propio backend, a falta de realizar más pruebas, la forma que tendremos de hacerlo será utilizando RestTemplate:

...