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
:
Code Block |
---|
|
<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.:
Code Block |
---|
|
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:
Code Block |
---|
|
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.:
Code Block |
---|
|
@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:
Code Block |
---|
|
@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:
Code Block |
---|
|
@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:
Code Block |
---|
|
@Component
public class MyClass {
private GithubClient ghClient;
public MyClass(GithubClient ghClient) {
this.ghClient = ghClient;
}
public List<Repo> getRepositories(String user) {
return ghClient.getRepositories(user);
} |