TODO:
...
beskrivning
...
konfiguration
...
Denna starter förenklar användningen av Spring Frameworks WebClient som REST-klient. För att använda den, lägg till följande i tjänstens pom.xml
:
Code Block | ||
---|---|---|
| ||
<dependency>
<groupId>se.sundsvall.dept44</groupId>
<artifactId>dept44-starter-webclient</artifactId>
</dependency> |
Användning
WebClientBuilder
används för att skapa upp en REST-klient (WebClient
):
Code Block | ||
---|---|---|
| ||
WebClient webClient = new WebClientBuilder()
.withBaseUrl("https://api.github.com/") [1]
.withLogbook(...) [2]
.withOAuth2Client(...) [3]
.withBasicAuthentication(...) [4]
.withConnectTimeout(...) [5]
.withReadTimeout(...) [6]
.build(); [7]
...
String user = "Sundsvallskommun";
Mono<List<Repo>> repos = webClient.get()
.uri("/users/{user}/repos", user)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response -> ...)
.onStatus(HttpStatus::is5xxServerError, response -> ...)
.bodyToMono(new ParameterizedTypeReference<List<Repo>>() {});
... |
[1]
Anger bas-URL för REST-klienten som skapas.[2]
Om angiven sätts request- och response-loggning upp.[3]
Om angiven, sätts OAuth2-autentisering upp. Tar in en ClientRegistration
, t.ex.:
Code Block | ||
---|---|---|
| ||
@Bean
ClientRegistration clientRegistration() {
return ClientRegistration.withRegistrationId("someId")
.clientId("someClientId")
.clientSecret("someClientSecret")
.tokenUri("https://somehost.com/token")
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
.build();
} |
[4]
Om angiven (användarnamn och lösenord) sätts Basic-autentisering upp.[5]
Anger connect timeout. Default-värde är 10 sekunder.[6]
Anger read timeout. Default-värde är 60 sekunder.[7]
Skapar själva REST-klienten.
WebClient
är i grundutförande reaktiv (asynkron) med stöd för Project Reactor:s Mono
och Flux
. Spring Framework hanterar detta sömlöst sett till att exponerade endpoints kan returnera värden av de typerna utan att det egentligen blir någon skillnad för anropande klienter, men i det fall att man vill använda WebClient
på ett synkront sätt kan man använda .block()
, vilket då i exemplet ovan skulle bli:
Code Block |
---|
...
String user = "Sundsvallskommun";
List<Repo> repos = webClient.get()
.uri("/users/{user}/repos", user)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response -> ...)
.onStatus(HttpStatus::is5xxServerError, response -> ...)
.bodyToMono(new ParameterizedTypeReference<List<Repo>>() {})
.block();
... |