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("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); }