APIとの通信をしようとすると、該当のAPIとやりとりするため専用のXxxApiClientとかリクエスト・レスポンスオブジェクトとかを定義しないといけません。
けど、世に出ている〇〇ライブラリってリクエストやレスポンスもライブラリの中に入っていて、接続情報を設定するくらいで使えて便利です。
SpringBootでもHttpInterfaceを利用するとライブラリを配ることで同じような世界観を実現することができます!
ライブラリの作成
まずはベースとなるライブラリの作成です。
このライブラリをClientでもServerでも利用します。
RestControllerでサーバ側のメソッドを定義するような感じで実装していけば良いのですが、@HttpExchange
といったHttp Interface専用アノテーションを利用します。
@HttpExchange("/api")
public interface SampleApiInterface {
@PostExchange("/sample")
SampleApiResponse sample(@RequestBody SampleApiRequest request);
}
public record SampleApiRequest(String message) {
}
public record SampleApiResponse(String result) {
}
@HttpExchange("/api/kt")
interface SampleApiInterfaceKt {
@PostExchange("/sample")
fun sample(@RequestBody request: SampleApiRequestKt): SampleApiResponseKt
}
data class SampleApiRequestKt(
val message: String,
)
data class SampleApiResponseKt(
val result: String,
)
あとはライブラリとしてMaven Repository等にアップロードします。
ライブラリの作り方は以下もご参考に!

サーバの実装
ライブラリで、エンドポイントやリクエスト・レスポンスクラスが定義済みなので、
APIの動作の部分に集中して実装することができます!
@RestController
public class SampleApiController implements SampleApiInterface {
@Override
public SampleApiResponse sample(SampleApiRequest request) {
return new SampleApiResponse("Hello, " + request.message());
}
}
@RestController
class SampleApiControllerKt: SampleApiInterfaceKt {
override fun sample(request: SampleApiRequestKt): SampleApiResponseKt {
return SampleApiResponseKt("Hello, ${request.message}")
}
}
ライブラリで実装したinterfaceを実装する以外は普通のControllerと一緒です!
クライアントの実装
HttpServiceProxyFactoryにライブラリで作成したinterfaceを渡すだけ!
RestClientとかWebClientとかで接続先やタイムアウト等を設定する部分だけに集中できます!
@Configuration
public class SampleApiClientConfiguration {
@Bean
public SampleApiInterface sampleClient() {
var restClient = RestClient.builder()
.baseUrl("http://localhost:8080/")
.build();
var adapter = RestClientAdapter.create(restClient);
var factory = HttpServiceProxyFactory.builderFor(adapter).build();
return factory.createClient(SampleApiInterface.class);
}
}
@Configuration
class SampleApiClientConfigurationKt {
@Bean
fun sampleApiClientKt(): SampleApiInterfaceKt {
val restClient = RestClient.builder()
.baseUrl("http://localhost:8080/")
.build()
val adapter = RestClientAdapter.create(restClient)
val factory = HttpServiceProxyFactory.builderFor(adapter).build()
return factory.createClient(SampleApiInterfaceKt::class.java)
}
}