|
|
|
@ -19,6 +19,12 @@ package org.springframework.web.client.reactive.support; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Optional; |
|
|
|
import java.util.Optional; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import reactor.adapter.RxJava1Adapter; |
|
|
|
|
|
|
|
import reactor.core.publisher.Flux; |
|
|
|
|
|
|
|
import reactor.core.publisher.Mono; |
|
|
|
|
|
|
|
import rx.Observable; |
|
|
|
|
|
|
|
import rx.Single; |
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.core.ResolvableType; |
|
|
|
import org.springframework.core.ResolvableType; |
|
|
|
import org.springframework.http.HttpHeaders; |
|
|
|
import org.springframework.http.HttpHeaders; |
|
|
|
import org.springframework.http.MediaType; |
|
|
|
import org.springframework.http.MediaType; |
|
|
|
@ -27,13 +33,6 @@ import org.springframework.http.client.reactive.ClientHttpResponse; |
|
|
|
import org.springframework.http.converter.reactive.HttpMessageConverter; |
|
|
|
import org.springframework.http.converter.reactive.HttpMessageConverter; |
|
|
|
import org.springframework.web.client.reactive.ResponseExtractor; |
|
|
|
import org.springframework.web.client.reactive.ResponseExtractor; |
|
|
|
|
|
|
|
|
|
|
|
import reactor.core.converter.RxJava1ObservableConverter; |
|
|
|
|
|
|
|
import reactor.core.converter.RxJava1SingleConverter; |
|
|
|
|
|
|
|
import reactor.core.publisher.Flux; |
|
|
|
|
|
|
|
import reactor.core.publisher.Mono; |
|
|
|
|
|
|
|
import rx.Observable; |
|
|
|
|
|
|
|
import rx.Single; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Static factory methods for {@link ResponseExtractor} |
|
|
|
* Static factory methods for {@link ResponseExtractor} |
|
|
|
* based on the {@link Observable} and {@link Single} APIs. |
|
|
|
* based on the {@link Observable} and {@link Single} APIs. |
|
|
|
@ -50,8 +49,8 @@ public class RxJava1ResponseExtractors { |
|
|
|
public static <T> ResponseExtractor<Single<T>> body(Class<T> sourceClass) { |
|
|
|
public static <T> ResponseExtractor<Single<T>> body(Class<T> sourceClass) { |
|
|
|
|
|
|
|
|
|
|
|
ResolvableType resolvableType = ResolvableType.forClass(sourceClass); |
|
|
|
ResolvableType resolvableType = ResolvableType.forClass(sourceClass); |
|
|
|
return (clientResponse, messageConverters) -> (Single<T>) RxJava1SingleConverter |
|
|
|
return (clientResponse, messageConverters) -> (Single<T>) RxJava1Adapter |
|
|
|
.fromPublisher(clientResponse |
|
|
|
.publisherToSingle(clientResponse |
|
|
|
.flatMap(resp -> decodeResponseBody(resp, resolvableType, messageConverters)).next()); |
|
|
|
.flatMap(resp -> decodeResponseBody(resp, resolvableType, messageConverters)).next()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -61,8 +60,8 @@ public class RxJava1ResponseExtractors { |
|
|
|
public static <T> ResponseExtractor<Observable<T>> bodyStream(Class<T> sourceClass) { |
|
|
|
public static <T> ResponseExtractor<Observable<T>> bodyStream(Class<T> sourceClass) { |
|
|
|
|
|
|
|
|
|
|
|
ResolvableType resolvableType = ResolvableType.forClass(sourceClass); |
|
|
|
ResolvableType resolvableType = ResolvableType.forClass(sourceClass); |
|
|
|
return (clientResponse, messageConverters) -> RxJava1ObservableConverter |
|
|
|
return (clientResponse, messageConverters) -> RxJava1Adapter |
|
|
|
.fromPublisher(clientResponse |
|
|
|
.publisherToObservable(clientResponse |
|
|
|
.flatMap(resp -> decodeResponseBody(resp, resolvableType, messageConverters))); |
|
|
|
.flatMap(resp -> decodeResponseBody(resp, resolvableType, messageConverters))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -75,7 +74,7 @@ public class RxJava1ResponseExtractors { |
|
|
|
|
|
|
|
|
|
|
|
ResolvableType resolvableType = ResolvableType.forClass(sourceClass); |
|
|
|
ResolvableType resolvableType = ResolvableType.forClass(sourceClass); |
|
|
|
return (clientResponse, messageConverters) -> |
|
|
|
return (clientResponse, messageConverters) -> |
|
|
|
RxJava1SingleConverter.fromPublisher(clientResponse |
|
|
|
RxJava1Adapter.publisherToSingle(clientResponse |
|
|
|
.then(response -> |
|
|
|
.then(response -> |
|
|
|
Mono.when( |
|
|
|
Mono.when( |
|
|
|
decodeResponseBody(response, resolvableType, messageConverters).next(), |
|
|
|
decodeResponseBody(response, resolvableType, messageConverters).next(), |
|
|
|
@ -91,9 +90,9 @@ public class RxJava1ResponseExtractors { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static <T> ResponseExtractor<Single<ResponseEntity<Observable<T>>>> responseStream(Class<T> sourceClass) { |
|
|
|
public static <T> ResponseExtractor<Single<ResponseEntity<Observable<T>>>> responseStream(Class<T> sourceClass) { |
|
|
|
ResolvableType resolvableType = ResolvableType.forClass(sourceClass); |
|
|
|
ResolvableType resolvableType = ResolvableType.forClass(sourceClass); |
|
|
|
return (clientResponse, messageConverters) -> RxJava1SingleConverter.fromPublisher( |
|
|
|
return (clientResponse, messageConverters) -> RxJava1Adapter.publisherToSingle( |
|
|
|
clientResponse.map(response -> new ResponseEntity<>( |
|
|
|
clientResponse.map(response -> new ResponseEntity<>( |
|
|
|
RxJava1ObservableConverter.fromPublisher( |
|
|
|
RxJava1Adapter.publisherToObservable( |
|
|
|
RxJava1ResponseExtractors.<T> decodeResponseBody(response, resolvableType, messageConverters)), |
|
|
|
RxJava1ResponseExtractors.<T> decodeResponseBody(response, resolvableType, messageConverters)), |
|
|
|
response.getHeaders(), |
|
|
|
response.getHeaders(), |
|
|
|
response.getStatusCode()))); |
|
|
|
response.getStatusCode()))); |
|
|
|
@ -103,8 +102,8 @@ public class RxJava1ResponseExtractors { |
|
|
|
* Extract the response headers as an {@code HttpHeaders} instance. |
|
|
|
* Extract the response headers as an {@code HttpHeaders} instance. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static ResponseExtractor<Single<HttpHeaders>> headers() { |
|
|
|
public static ResponseExtractor<Single<HttpHeaders>> headers() { |
|
|
|
return (clientResponse, messageConverters) -> RxJava1SingleConverter |
|
|
|
return (clientResponse, messageConverters) -> RxJava1Adapter |
|
|
|
.fromPublisher(clientResponse.map(resp -> resp.getHeaders())); |
|
|
|
.publisherToSingle(clientResponse.map(resp -> resp.getHeaders())); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
|