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