Consume Reactive Web Service sử dụng WebClient của Spring WebFlux

WebClient là một interface, implementation là đối tượng DefaultWebClient, được giới thiệu cùng với Spring WebFlux giúp chúng ta có thể consume các Reactive Web Service. Cách tạo request và handle response sử dụng WebClient như thế nào? Chúng ta hãy cùng nhau tìm hiểu trong bài viết này các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Spring Boot project với Spring WebFlux dependency để làm ví dụ:

Kết quả:

Consume Reactive Web Service sử dụng WebClient của Spring WebFlux

Để làm ví dụ về Reactive Web Service, mình sẽ sử dụng ví dụ mà mình đã tạo trong bài viết Reactive web sử dụng annotation với Spring WebFlux nhé các bạn:

Consume Reactive Web Service sử dụng WebClient của Spring WebFlux

Và để đơn giản, mình sẽ code để chạy Java console với Spring Boot bằng cách hiện thực interface CommandLineRunner như sau:

Vì Spring Boot project ví dụ của chúng ta có khai báo dependency cho Spring WebFlux nên khi chạy, ứng dụng của chúng ta sẽ start sử dụng port mặc định là 8080. Do Reactive Web Service mà mình sử dụng đã chạy trên port 8080 rồi nên mình sẽ đổi port cho ví dụ của chúng ta trong bài viết này sử dụng port 8081. Chúng ta chỉ cần khai báo property server.port=8081 trong tập tin application.properties là được nha các bạn.

OK, mọi thứ chuẩn bị đã xong, giờ chúng ta đi vào chủ đề chính của bài viết này các bạn nhé!



Mình sẽ khai báo base URL mà ví dụ của chúng ta sẽ consume như sau:

Để sử dụng đối tượng WebClient consume Reactive Web Service trên, đầu tiên, mình cần khởi tạo mới đối tượng cho nó.

Có 3 cách để làm điều này:

Cách thứ nhất là chúng ta sẽ tạo đối tượng WebClient với các cấu hình mặc định như sau:

Cách thứ hai là chúng ta sẽ tạo mới đối tượng WebClient với request URL mà chúng ta cần consume:

Cách cuối cùng là chúng ta có thể sử dụng đối tượng DefaultWebClientBuilder để có thể khởi tạo đối tượng WebClient với nhiều thông tin khác:

Ở đây, mình chỉ khởi tạo đối tượng WebClient sử dụng đối tượng DefaultWebClientBuilder với thông tin đơn giản là baseUrl. Các bạn có thể cấu hình thêm nhiều thông tin khác nữa, ví dụ như:

Consume Reactive Web Service sử dụng WebClient của Spring WebFlux

Trong bài viết này, mình sẽ sử dụng cách thứ 3 các bạn nhé!

Sau khi đã có đối tượng WebClient, các bạn có thể sử dụng nó để build request, send request và nhận response.

WebClient hỗ trợ cho chúng ta tất cả các HTTP method giúp chúng ta có thể dễ dàng build một request bất kỳ.

Các bạn có thể sử dụng các method get(), post(), put(), patch(), delete() để build các request GET, POST, PUT, PATCH, DELETE:

hoặc có thể sử dụng phương thức method() với tham số là enum HttpMethod để làm điều này:

Sau khi đã định nghĩa HTTP method xong, các bạn cần định nghĩa URI mà các bạn cần request. Trong ví dụ của mình thì định nghĩa này sẽ là:

Tiếp theo thì tuỳ theo request, các bạn cần build body data cho request đó. GET request thì không cần nhưng POST request thì sẽ cần. Trong trường hợp của POST thì phần body data chúng ta sẽ sử dụng phương thức body(), ví dụ như sau:

Ở đây, chúng ta đã sử dụng abstract class BodyInserters để làm nhiệm vụ populate data vào phần body của request. Class này hỗ trợ cho chúng ta nhiều phương thức khác nhau để populate nhiều loại data khác nhau. Các bạn có thể tìm hiểu thêm nhé!

Trong bài viết này, request của mình là một GET request nên code của mình chỉ đơn giản như sau:

Sau khi đã build request xong, giờ thì chúng ta sẽ bắt đầu send request và nhận response.

Để làm được điều này, các bạn hãy sử dụng phương thức exchangeToMono(), exchangeToFlux() hoặc retrieve(). Sự khác nhau giữa các phương thức exchange() và phương thức retrieve() này chủ yếu là ở kiểu dữ liệu mà chúng trả về.

Các phương thức exchange() trả về một đối tượng ClientResponse với HTTP Status và thông tin về header. Chúng ta có thể sử dụng các phương thức bodyToMono() hoặc bodyToFlux() để nhận data trong phần body của response. Ví dụ như sau:

Còn phương thức retrieve() thì sẽ trả về đối tượng ResponseSpec giúp chúng ta có thể lấy được data trong phần body của response trực tiếp luôn:

Như các bạn thấy, tương tự như khi sử dụng các phương thức exchange(), chúng ta sẽ sử dụng phương thức bodyToFlux() hoặc bodyToMono() để lấy dữ liệu trong phần body của response. Các phương thức này sẽ throw WebClientResponseException nếu HTTP Status trả về là 4xx (lỗi do client) hoặc 5xx (lỗi do server) các bạn nhé!

Sau khi đã có đối tượng Flux hoặc Mono từ response body xong, các bạn có thể sử dụng những đối tượng này để lấy ra dữ liệu mà mình cần.

Lấy dữ liệu đầu tiên khi ví dụ của chúng ta kết nối tới Reactive Web Service:

Kết quả:

Consume Reactive Web Service sử dụng WebClient của Spring WebFlux

Nếu các bạn muốn keep subscribe để nhận data mỗi khi có data mới được thêm vào thì có thể code như sau:

Kết quả:

Consume Reactive Web Service sử dụng WebClient của Spring WebFlux

Add Comment