Reactive Streams Wrapper --- This module wraps Feign's http requests in a [Reactive Streams](https://reactive-streams.org) Publisher, enabling the use of Reactive Stream `Publisher` return types. Supported Reactive Streams implementations are: * [Reactor](https://projectreactor.io/) (`Mono` and `Flux`) * [ReactiveX (RxJava)](https://reactivex.io) (`Flowable` only) To use these wrappers, add the `feign-reactive-wrappers` module, and your desired `reactive-streams` implementation to your classpath. Then configure Feign to use the reactive streams wrappers. ```java public interface GitHubReactor { @RequestLine("GET /repos/{owner}/{repo}/contributors") Flux contributors(@Param("owner") String owner, @Param("repo") String repo); class Contributor { String login; public Contributor(String login) { this.login = login; } } } public class ExampleReactor { public static void main(String args[]) { GitHubReactor gitHub = ReactorFeign.builder() .target(GitHubReactor.class, "https://api.github.com"); List contributors = gitHub.contributors("OpenFeign", "feign") .collect(Collectors.toList()) .block(); } } public interface GitHubReactiveX { @RequestLine("GET /repos/{owner}/{repo}/contributors") Flowable contributors(@Param("owner") String owner, @Param("repo") String repo); class Contributor { String login; public Contributor(String login) { this.login = login; } } } public class ExampleRxJava2 { public static void main(String args[]) { GitHubReactiveX gitHub = RxJavaFeign.builder() .target(GitHub.class, "https://api.github.com"); List contributors = gitHub.contributors("OpenFeign", "feign") .collect(Collectors.toList()) .block(); } } ``` Considerations --- These wrappers are not *reactive all the way down*, given that Feign generated requests are synchronous. Requests still block, but execution is controlled by the `Publisher` and their related `Scheduler`. While this may not be ideal in terms of a fully reactive application, providing these wrappers provide an intermediate upgrade path for Feign. ### Streaming Methods that return `java.util.streams` Types are not supported. Responses are read fully, the wrapped in the appropriate reactive wrappers. ### Iterable and Collections responses Due to the Synchronous nature of Feign requests, methods that return `Iterable` types must specify the collection in the `Publisher`. For `Reactor` types, this limits the use of `Flux` as a response type. If you want to use `Flux`, you will need to manually convert the `Mono` or `Iterable` response types into `Flux` using the `fromIterable` method. ```java public interface GitHub { @RequestLine("GET /repos/{owner}/{repo}/contributors") Mono> contributors(@Param("owner") String owner, @Param("repo") String repo); class Contributor { String login; public Contributor(String login) { this.login = login; } } } public class ExampleApplication { public static void main(String[] args) { GitHub gitHub = ReactorFeign.builder() .target(GitHub.class, "https://api.github.com"); Mono> contributors = gitHub.contributors("OpenFeign", "feign"); Flux contributorFlux = Flux.fromIterable(contributors.block()); } } ```