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 15 Next »

Denna starter förenklar användningen av Feign som REST-klient, via Spring Cloud OpenFeign. 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-feign</artifactId>
</dependency>


Alternativ 1 - FeignBuilder

FeignBuilder används, precis som det låter, för att bygga en REST-klient vars metoder definieras i ett interface som annoteras med Spring:s annoteringar för request-mappning, t.ex.:

public interface GithubClient {

    @GetMapping("users/{user}/repos")
    List<Repo> getRepositories(@PathVariable("user") String user);
}


FeignBuilder kan sedan användas för att skapa upp en faktisk klient:

GithubClient ghClient = new FeignBuilder()
    .withBaseUrl("https://api.github.com/") [1]
    .withLogbook(...)                       [2]
    .withOAuth2Client(...)                  [3]
    .withBasicAuthentication(...)           [4]
    .withConnectTimeout(...)                [5]
    .withReadTimeout(...)                   [6]
    .withFollowRedirects(...)               [7]
    .withClient(...)                        |8]
    .withContract(...)                      [9]
    .withEncoder(...)                       [10]
    .withDecoder(...)                       [11]
    .withRetryer(...)                       [12]
    .build(GithubClient.class);             [13]
    
...
List<Repo> repos = ghClient.getRepositories("Sundsvallskommun");
...

[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(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] Anger om REST-klienten ska följa omdirigeringar. Default-värde är true.
[8]-[12] Kan, om så önskas, användas för att exempelvis använda en alternativ HTTP-klient eller för att konfigurera retry-policy och liknande.
[13] Skapar själva REST-klienten, av given typ.

Notera att det inte går att använda FeignBuilder där OAuth2- och Basic-autentisering konfigureras samtidigt.

Alternativ 2 - annoteringar

Först och främst behövs ett klient-interface:

@FeignClient(
    name = "myGithubClient",                        [1]
    url = "https://api.github.com/",                [2]
    configuration = GithubClientConfiguration.class [3]
)
public interface GithubClient {

    @GetMapping("users/{user}/repos")
    List<Repo> getRepositories(@PathVariable("user") String user);
}

[1] Anger namn på Feign-klienten
[2] Anger bas-URL för klienten. Kan utgöras av Spring EL-uttryck/properties, t.ex. från konfiguration (t.ex. "${some.url}")
[3] Anger en konfigurationsklass för klienten - en vanlig Spring-konfiguration där alla ingående bönor används för att konfigurera klienten.

Exempel på klient-konfiguration:

@Import(FeignConfiguration.class)
class GithubClientConfiguration {

    @Bean
    RequestInterceptor basicAuthInterceptor(String username, String password) { [1]
        return FeignHelper.basicAuthInterceptor(username, password);
    }

    @Bean
    FeignBuilderCustomizer feignBuilderCustomizer() {                           [2]
        return FeignHelper.customizeRequestOptions()
            .withConnectTimeout(Duration.ofSeconds(60))
            .withReadTimeout(Duration.ofSeconds(5))
            .build();
    }
}

Ifall konfigurationen definierar någon böna av typen RequestInterceptor, likt [1], kommer den automatiskt att knytas in i Feign-klienten. I exemplet används en utility-klass från ramverket - FeignHelper - för att skapa en interceptor för Basic-autentisering. FeignHelper har även stöd för att jacka in exempelvis en interceptor för OAuth2 och för att anpassa timeouts likt [2].

Utifrån ovan kan sedan klienten autowire:as in som en vanlig Spring-komponent där den behövs:

@Component
public class MyClass {
  
  private GithubClient ghClient;
  
  public MyClass(GithubClient ghClient) {
      this.ghClient = ghClient;
  }
  
  public List<Repo> getRepositories(String user) {
      return ghClient.getRepositories(user);
  }
  • No labels