Micronaut HTTP Client - just the response body

In a previous post, we used io.micronaut.http.client.BlockingHttpClient to get response from an HTTP endpoint. We used the exchange method as follows.

HttpResponse response = client.toBlocking().exchange("/greeting", String)
If you are using Java instead of Groovy, you will pass "String.class" instead of "String".

We had to pass an extra argument to get the response body. There are cases when all you need is the response body as a Java object. For these cases, you could make use of the retrieve method as follows.

package com.nareshak.demo

import io.micronaut.http.client.annotation.Client
import io.micronaut.runtime.server.EmbeddedServer
import io.micronaut.test.annotation.MicronautTest
import io.micronaut.http.client.RxHttpClient
import spock.lang.AutoCleanup
import spock.lang.Specification
import spock.lang.Shared

import javax.inject.Inject

@MicronautTest
class GreetingControllerSpec extends Specification {

    @Shared @Inject
    EmbeddedServer embeddedServer

    @Shared @AutoCleanup @Inject @Client("/")
    RxHttpClient client

    def "greeting endpoint should return Hello"() {
        given:
        String result = client.toBlocking().retrieve("/greeting")

        expect:
        result == "Hello"
    }
}

Let's compare the two methods.

HttpResponse response = client.toBlocking().exchange("/greeting", String)
String result = client.toBlocking().retrieve("/greeting")

When using the retrieve method, String is the default response body type. Hence we didn't have to pass it as an argument. Also, the method readily returns the response body. Thus we saved a few additional method calls, which we had to invoke when the exchange method returned an instance of HttpResponse.

If your endpoint returns an instance of Greeting class, you could invoke retrieve as follows.

Greeting greeting = client.toBlocking().retrieve("/greeting", Greeting)

Now both exchange and retrieve have their use-cases. If all you want is the response body, the retrieve method helps you to be concise and straightforward. If you are also interested in the response status or headers, you will have to opt for the exchange method. If you are writing test cases, it's unlikely you write any conditional logic based on the response status (they should be separate test cases). Hence retrieve is the most favourable option here.

Micronaut version used: 2.0.0.