Declarative HTTP Clients in Spring Boot 3 with Kotlin

Declarative HTTP Clients in Spring Boot 3 with Kotlin

Better Efficiency and Improved Code Readability


2 min read

Table of contents

No heading

No headings in the article.

Kotlin and Spring Boot 3 make a powerful combination for building modern, scalable applications. With the introduction of declarative HTTP clients in Spring Boot 3, developers can define their HTTP client configurations in a concise, readable manner.

In this blog post, we'll explore how to use declarative HTTP clients in Spring Boot 3 with Kotlin to streamline your development process and increase your productivity.

  1. Setting up Spring Boot 3

    To use declarative HTTP clients in Spring Boot 3 with Kotlin, you'll need to have a Spring Boot 3 project set up using Kotlin as the programming language. You can create a new Spring Boot 3 project using the Spring Initializer and selecting Kotlin as the programming language.

  2. Enabling declarative HTTP clients

    Remember to use the webflux dependency to enable declarative clients. If you already have your project set up, you'll need to enable the HTTP clients by adding the following dependency to your project:

  3. Defining your client

    Next, you'll need to define your HTTP client by creating a new interface. This interface will define all of the endpoints that you need to make HTTP requests to.

     import org.springframework.web.bind.annotation.PathVariable
     import org.springframework.web.service.annotation.GetExchange
     import org.springframework.web.service.annotation.HttpExchange
     interface ImdbClient {
         fun getShow(@PathVariable("showId") showId: String): ResponseEntity<Show>
    • @HttpExchange: Used here in the class level to declare the base path for all the http calls. Also can be used to declare other parameters of the http call.

    • @GetExchange: a specialized version of @HttpExchange with GET method to use with individual methods.

    • @PathVariable: Annotation which indicates that a method parameter should be bound to a URI template variable. Note the templated path variable showId in the @GetExchange("/{showId}") annotation.

  4. Autowiring your client

    you can autowire your client into your application and use it to make HTTP requests.

     class TestService(
         private val client: ImdbClient
     ) {
         fun getShows() {
             val show = client.getShow("1")
  5. Configuration

    Finally, You can customize and bootstrap your HTTP client by supplying a configuration to bind it with a webclient instance. This will allow you to configure the underlying WebClient.Builder used to create your client.

     class Config {
         fun imdbClient(builder: WebClient.Builder): ImdbClient {
             val webClient = builder.baseUrl("").build()
             return HttpServiceProxyFactory.builder(WebClientAdapter.forClient(webClient)).build()

    In conclusion, declarative HTTP clients in Spring Boot 3 and Kotlin provide a simple and efficient way to handle HTTP requests in your applications. With its concise syntax and powerful features, you can streamline your development process and improve the overall quality of your code.

Did you find this article valuable?

Support Driptaroop Das by becoming a sponsor. Any amount is appreciated!