Versiones comparadas

Clave

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

...

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

...

Este apartado queda obsoleto, se manendrá aquí temporalmente. RestTemplate queda obsoleto, hay que utilizar WebClient, está documentado en la siguiente página: WebClient - Cliente REST en Spring Boot


Expandir
titleClick aquí para ver explicación antigua

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:, que lo tendremos como un bean en una clase de configuración que tendremos que crear:

Bloque de código
languagejava
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
	return new RestTemplate();
    }
}

Después, en la clase en la que vayamos a utilizarlo, sólo tendremos que cargarlo con Autowired:

Bloque de código
languagejava
@Autowired
private RestTemplate restTemplate;

Para utilizarlo, formamos el URI con UriComponentsBuilder:

Bloque de código
languagejava
// Uri
final URI uri = UriComponentsBuilder.fromHttpUrl( url ).path( "/" + "pidAplicationid" ).path( "/firma" )
		.queryParam( "parametro", "valor" ).queryParam( "otroParametro", "otroValor" ).build().encode().toUri();

Con .path, se concatena lo que indiquemos al path, y con .queryParam indicamos los parámetros que se pasan por la propia url.

Podemos añadir headers con HttpHeaders:

Bloque de código
languagejava
// HEADERS
final HttpHeaders headers = new HttpHeaders();
// Ponemos el tipo del contenido que irá en el body
headers.setContentType( MediaType.APPLICATION_JSON );
// Para indicar el accept, pide una lista de MediaType
final ArrayList<MediaType> listaAccept = new ArrayList<>();
listaAccept.add( MediaType.APPLICATION_JSON );
headers.setAccept( listaAccept );
// Añadimos los headers que queramos con nombre-valor de esta manera
headers.add( "X-Client-Id", ficha.getAplicacionId );

Los headers los incluiremos en un objeto HttpEntity, junto con el objeto a pasar (el body) si se pasa alguno:

Bloque de código
languagejava
// HttpEntity
final HttpEntity<String> httpEntity = new HttpEntity<>( objeto, headers );

En el caso de que sólo queramos pasar los headers, HttpEntity dispone de un constructor para ello, con el que no haría falta parametrizar el tipo del objeto que se le pasa como cuerpo del mensaje, pues no habrá ninguno. La sintaxis sería la siguiente:

Bloque de código
languagejava
final HttpEntity<?> httpEntity = new HttpEntity<>( headers );

Para lanzar las peticiones tenemos diferentes opciones. En primer lugar, disponemos de cuatro métodos básicos para hacer GET, POST, PUT, DELETE:

Bloque de código
languagejava
ResponseEntity<String> response1 = restTemplate.getForEntity( uri, String.class );
ResponseEntity<String> response2 = restTemplate.postForEntity( uri, httpEntity, String.class );
restTemplate.put( uri, httpEntity );
restTemplate.delete( uri );

Para las operaciones básicas estos métodos pueden ser útiles, pero como vemos, solo podemos pasar el objeto HttpEntity haciendo POST, pero podemos necesitar añadir headers en un GET para, por ejemplo, pasar un token de autenticación. Para hacer esto, podemos utilizar el método .exchange, al que tenemos que indicarle la Uri, el método http a utilizar, el objeto HttpEntity a pasar (puede ser null) y la clase del objeto que se espera recibir:

Bloque de código
languagejava
final ResponseEntity<String> response = restTemplate.exchange( uri, HttpMethod.GET, httpEntity, String.class );

Como vemos, estamos utilizando el tipo ResponseEntity. RestTemplate tiene métodos para obtener directamente el objeto del tipo que se espera, pero ResponseEntity nos permite explorar todos los detalles del mensaje, y podemos obtener el objeto correspondiente con .getBody().

...