Nesse artigo vou mostrar como fazer um cliente para uma API Rest com Spring 5 usando a classe WebClient que é parte do novo WebFlux Framework. Esse cliente vai consumir uma API de Livros. Aproveitando o post, já vou criar esse cliente em uma classe de teste usando JUnit para mostrar o teste de APIs com ele. Mas a forma de uso aqui não se limita a testes.
Como o foco é a construção de um cliente para consumir uma API, vou omitir o código da API, trazendo só a construção do cliente. Então vamos ao código:
import java.util.List;
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.WebClient;
import
org.springframework.web.reactive.function.client.WebClient.Builder;
import
org.springframework.web.reactive.function.client.WebClient.ResponseSpec;
import br.com.socialbooks.model.Livro;
import reactor.core.publisher.Mono;
class LivroControllerTest {
@BeforeAll
static void inserirLivro() {
// configura uma requisição
Builder
builder = WebClient.builder();
builder.baseUrl("http://localhost:8080");
Livro
livro = new Livro("Aprendendo Spring boot");
// prepara o cliente
WebClient
client = builder.build();
ResponseSpec
response = client.method(HttpMethod.POST).uri("/livros").bodyValue(livro).retrieve();
// recebendo o recurso salvo
Mono<Livro>
monoLivro = response.bodyToMono(Livro.class);
livro = monoLivro.block();
}
@Test
void testGetListaLivros() {
// configura uma requisição
Builder
builder = WebClient.builder();
builder.baseUrl("http://localhost:8080");
builder.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
// prepara o client
WebClient
client = builder.build();
ResponseSpec
response = client.method(HttpMethod.GET).uri("/livros").retrieve();
/*
* recebe o Mono que executa
de forma assíncrona. OBS: Para carregar uma
lista
* de objetos, é preciso usar
o ParameterizedTypeReference.
*/
Mono<List<Livro>>
monoLivro = response.bodyToMono(new
ParameterizedTypeReference<List<Livro>>() {
});
// como funciona de forma assincrona, usamos o block para forçar ele esperar a resposta.
List<Livro>
livros = monoLivro.block();
Assert.assertTrue(livros.get(0).getTituloLivro().equals("Aprendendo Spring boot"));
}
@Test
void testGetLivro() {
// configura uma requisição
Builder
builder = WebClient.builder();
builder.baseUrl("http://localhost:8080");
builder.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
// prepara o client
WebClient
client = builder.build();
ResponseSpec response = client.method(HttpMethod.GET).uri("/livros/1").retrieve();
// recebe o Mono que executa de forma
assíncrona
Mono<Livro>
monoLivro = response.bodyToMono(Livro.class);
// como funciona de forma assincrona, usamos o block para forçar ele esperar
// a resposta.
Livro livro = monoLivro.block();
Assert.assertTrue(livro.getTituloLivro().equals("Aprendendo Spring boot"));
}
}
Pra esse artigo é só.
Nenhum comentário:
Postar um comentário