Comment obtenir à la fois le corps et l'état de la réponse HTTP lors de l'utilisation du client HTTP Reactor Netty


Finlay Weber

J'utilise le client HTTP Reactor Netty ici en tant que dépendance autonome, c'est-à-dire pas via spring-webfluxparce que je ne veux pas faire glisser les dépendances liées à Spring

Comme le montre la documentation, il est possible de faire une demande qui retourne HttpClientResponse

import reactor.netty.http.client.HttpClient;
import reactor.netty.http.client.HttpClientResponse;

public class Application {

    public static void main(String[] args) {
        HttpClientResponse response =
                HttpClient.create()                   
                          .get()                      
                          .uri("http://example.com/") 
                          .response()                 
                          .block();
    }
}

La chose HttpClientResponsene contient que les en-têtes et le staus. Comme on peut le voir dans ses documents Java ici

Aussi à partir de l'exemple de consommation de données, on peut faire

import reactor.netty.http.client.HttpClient;

public class Application {

    public static void main(String[] args) {
        String response =
                HttpClient.create()
                          .get()
                          .uri("http://example.com/")
                          .responseContent() 
                          .aggregate()       
                          .asString()        
                          .block();
    }
}

Mais cela ne renvoie que les données d'entité http sous forme de chaîne. Aucune information sur les en-têtes ni le code d'état.

Le problème que j'ai maintenant est que je dois faire une demande et obtenir une réponse qui me donne à la fois les en-têtes, le statut, etc. avec le corps de la réponse http.

Je n'arrive pas à trouver comment. Des idées? Qw

Denis Zavedeev

Jetez un œil aux méthodes suivantes:

Ils vous permettent d'accéder simultanément au corps de la réponse , à l' état et aux en- têtes http .

Par exemple, en utilisant la responseSingleméthode, vous pouvez effectuer les opérations suivantes:

private Mono<Foo> getFoo() {
    return httpClient.get()
            .uri("foos/1")
            .responseSingle(
                    (response, bytes) ->
                            bytes.asString()
                                    .map(it -> new Foo(response.status().code(), it))
            );
}

Le code ci-dessus traduit la réponse en un objet de domaine Foodéfini comme suit:

public static class Foo {
    int status;
    String response;

    public Foo(int status, String response) {
        this.status = status;
        this.response = response;
    }
}

Articles connexes