Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

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:

<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 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.:

@Bean
ClientRegistration clientRegistration() {
    return ClientRegistration.withRegistrationId("someId")
        .clientId("someClientId")
        .clientSecret("someClientSecret")
        .tokenUri("https://somehost.com/token")
        .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.

(info) 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:

...
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();
...

  • No labels