Comment obtenir à la fois le corps et l'état de la réponse HTTP lors de l'utilisation du client HTTP Reactor Netty
J'utilise le client HTTP Reactor Netty ici en tant que dépendance autonome, c'est-à-dire pas via spring-webflux
parce 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 HttpClientResponse
ne 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
Jetez un œil aux méthodes suivantes:
Flux<V> response(BiFunction<HttpClientResponse,ByteBufFlux,Publisher<V>> receiver)
Mono<V> responseSingle(BiFunction<HttpClientResponse, ByteBufMono, Mono<V>> receiver)
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 responseSingle
mé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 Foo
défini comme suit:
public static class Foo {
int status;
String response;
public Foo(int status, String response) {
this.status = status;
this.response = response;
}
}