49 lines
3.2 KiB
Plaintext
49 lines
3.2 KiB
Plaintext
[[features.webclient]]
|
|
== Calling REST Services with WebClient
|
|
If you have Spring WebFlux on your classpath, you can also choose to use `WebClient` to call remote REST services.
|
|
Compared to `RestTemplate`, this client has a more functional feel and is fully reactive.
|
|
You can learn more about the `WebClient` in the dedicated {spring-framework-docs}/web-reactive.html#webflux-client[section in the Spring Framework docs].
|
|
|
|
Spring Boot creates and pre-configures a `WebClient.Builder` for you.
|
|
It is strongly advised to inject it in your components and use it to create `WebClient` instances.
|
|
Spring Boot is configuring that builder to share HTTP resources, reflect codecs setup in the same fashion as the server ones (see <<features#features.developing-web-applications.spring-webflux.httpcodecs,WebFlux HTTP codecs auto-configuration>>), and more.
|
|
|
|
The following code shows a typical example:
|
|
|
|
[source,java,indent=0,subs="verbatim"]
|
|
----
|
|
include::{docs-java}/features/webclient/MyService.java[]
|
|
----
|
|
|
|
|
|
|
|
[[features.webclient.runtime]]
|
|
=== WebClient Runtime
|
|
Spring Boot will auto-detect which `ClientHttpConnector` to use to drive `WebClient`, depending on the libraries available on the application classpath.
|
|
For now, Reactor Netty and Jetty RS client are supported.
|
|
|
|
The `spring-boot-starter-webflux` starter depends on `io.projectreactor.netty:reactor-netty` by default, which brings both server and client implementations.
|
|
If you choose to use Jetty as a reactive server instead, you should add a dependency on the Jetty Reactive HTTP client library, `org.eclipse.jetty:jetty-reactive-httpclient`.
|
|
Using the same technology for server and client has it advantages, as it will automatically share HTTP resources between client and server.
|
|
|
|
Developers can override the resource configuration for Jetty and Reactor Netty by providing a custom `ReactorResourceFactory` or `JettyResourceFactory` bean - this will be applied to both clients and servers.
|
|
|
|
If you wish to override that choice for the client, you can define your own `ClientHttpConnector` bean and have full control over the client configuration.
|
|
|
|
You can learn more about the {spring-framework-docs}/web-reactive.html#webflux-client-builder[`WebClient` configuration options in the Spring Framework reference documentation].
|
|
|
|
|
|
|
|
[[features.webclient.customization]]
|
|
=== WebClient Customization
|
|
There are three main approaches to `WebClient` customization, depending on how broadly you want the customizations to apply.
|
|
|
|
To make the scope of any customizations as narrow as possible, inject the auto-configured `WebClient.Builder` and then call its methods as required.
|
|
`WebClient.Builder` instances are stateful: Any change on the builder is reflected in all clients subsequently created with it.
|
|
If you want to create several clients with the same builder, you can also consider cloning the builder with `WebClient.Builder other = builder.clone();`.
|
|
|
|
To make an application-wide, additive customization to all `WebClient.Builder` instances, you can declare `WebClientCustomizer` beans and change the `WebClient.Builder` locally at the point of injection.
|
|
|
|
Finally, you can fall back to the original API and use `WebClient.create()`.
|
|
In that case, no auto-configuration or `WebClientCustomizer` is applied.
|