@Test // SPR-14992 public void writeAndAutoFlushBeforeComplete() { Mono<String> result = this.webClient.get() .uri("/write-and-never-complete") .retrieve() .bodyToFlux(String.class) .next(); StepVerifier.create(result) .expectNextMatches(s -> s.startsWith("0123456789")) .expectComplete() .verify(Duration.ofSeconds(10L)); }
@Test // SPR-16494 @Ignore // https://github.com/reactor/reactor-netty/issues/283 public void serverDetectsClientDisconnect() { assumeTrue(this.server instanceof ReactorHttpServer); Flux<String> result = this.webClient.get() .uri("/infinite") .accept(TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(String.class); StepVerifier.create(result) .expectNext("foo 0") .expectNext("foo 1") .thenCancel() .verify(Duration.ofSeconds(5L)); SseController controller = this.wac.getBean(SseController.class); controller.cancellation.block(Duration.ofSeconds(5)); }
@Test public void writeAndFlushWith() { Mono<String> result = this.webClient.get() .uri("/write-and-flush") .retrieve() .bodyToFlux(String.class) .takeUntil(s -> s.endsWith("data1")) .reduce((s1, s2) -> s1 + s2); StepVerifier.create(result) .expectNext("data0data1") .expectComplete() .verify(Duration.ofSeconds(10L)); }
public static void main(String[] args) { WebClient client = WebClient.create("http://localhost:8080"); Flux<WebfluxApplication.Pojo> pojoFlux = client.get().uri("/dummy").retrieve().bodyToFlux(WebfluxApplication.Pojo.class); pojoFlux.count().block(); } }
@PostMapping("/booking") public Mono<ResponseEntity<Void>> book() { logger.debug("Processing booking request.."); return carsClient.get().uri("/cars") .retrieve() .bodyToFlux(Car.class) .doOnNext(car -> logger.debug("Trying to book " + car)) .take(5) .flatMap(this::requestCar) .next() .doOnNext(car -> logger.debug("Booked car " + car)); }
@Bean ApplicationRunner run(WebClient client) { //@formatter:off return args -> client .get() .uri("/books") .retrieve() .bodyToFlux(Book.class) .subscribe(System.out::println); //@formatter:on }
public MeasuresCollector(DashboardProperties properties, WebClient.Builder webClientBuilder) { WebClient webClient = webClientBuilder .baseUrl(properties.getGenerator().getServiceUrl()).build(); this.electricityMeasures = webClient .get().uri("/measures/firehose") .retrieve().bodyToFlux(ElectricityMeasure.class) .share(); }
@Test public void getHello() { final Flux<String> body = webClient.get() .uri(uri("/hello")) .retrieve() .bodyToFlux(String.class); StepVerifier.create(body) .expectNext("hello") .expectNext("armeria") .expectNext("world") .expectComplete() .verify(Duration.ofSeconds(10)); }
@Test public void getResource() { final Flux<DataBuffer> body = webClient.get() .uri(uri("/resource")) .retrieve() .bodyToFlux(DataBuffer.class); StepVerifier.create(body) .thenConsumeWhile(data -> data.readableByteCount() > 0) // An empty buffer comes last. .assertNext(data -> assertThat(data.readableByteCount()).isZero()) .expectComplete() .verify(Duration.ofSeconds(30)); }
@Test public void sseAsEvent() { Flux<ServerSentEvent<String>> result = this.webClient.get() .uri("/event") .accept(TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(new ParameterizedTypeReference<ServerSentEvent<String>>() {}); StepVerifier.create(result) .consumeNextWith( event -> { assertEquals("0", event.id()); assertEquals("foo", event.data()); assertEquals("bar", event.comment()); assertNull(event.event()); assertNull(event.retry()); }) .consumeNextWith( event -> { assertEquals("1", event.id()); assertEquals("foo", event.data()); assertEquals("bar", event.comment()); assertNull(event.event()); assertNull(event.retry()); }) .expectComplete() .verify(Duration.ofSeconds(5L)); }
@Test public void shouldReceiveJsonAsFluxPojo() { prepareResponse(response -> response .setHeader("Content-Type", "application/json") .setBody("[{\"bar\":\"bar1\",\"foo\":\"foo1\"},{\"bar\":\"bar2\",\"foo\":\"foo2\"}]")); Flux<Pojo> result = this.webClient.get() .uri("/pojos") .accept(MediaType.APPLICATION_JSON) .retrieve() .bodyToFlux(Pojo.class); StepVerifier.create(result) .consumeNextWith(p -> assertThat(p.getBar(), Matchers.is("bar1"))) .consumeNextWith(p -> assertThat(p.getBar(), Matchers.is("bar2"))) .expectComplete() .verify(Duration.ofSeconds(3)); expectRequestCount(1); expectRequest(request -> { assertEquals("/pojos", request.getPath()); assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT)); }); }
@Test public void shouldReceiveJsonAsFluxString() { String content = "{\"bar\":\"barbar\",\"foo\":\"foofoo\"}"; prepareResponse(response -> response .setHeader("Content-Type", "application/json").setBody(content)); Flux<String> result = this.webClient.get() .uri("/json").accept(MediaType.APPLICATION_JSON) .retrieve() .bodyToFlux(String.class); StepVerifier.create(result) .expectNext(content) .expectComplete().verify(Duration.ofSeconds(3)); expectRequestCount(1); expectRequest(request -> { assertEquals("/json", request.getPath()); assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT)); }); }
@Test public void sseAsPerson() { Flux<Person> result = this.webClient.get() .uri("/person") .accept(TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(Person.class); StepVerifier.create(result) .expectNext(new Person("foo 0")) .expectNext(new Person("foo 1")) .thenCancel() .verify(Duration.ofSeconds(5L)); }
@Test public void jsonStreaming() { Flux<Person> result = this.webClient.get() .uri("/stream") .accept(APPLICATION_STREAM_JSON) .retrieve() .bodyToFlux(Person.class); StepVerifier.create(result) .expectNext(new Person("foo 0")) .expectNext(new Person("foo 1")) .thenCancel() .verify(); }
@Test public void sseAsString() { Flux<String> result = this.webClient.get() .uri("/string") .accept(TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(String.class); StepVerifier.create(result) .expectNext("foo 0") .expectNext("foo 1") .thenCancel() .verify(Duration.ofSeconds(5L)); }
@Test public void smileStreaming() { Flux<Person> result = this.webClient.get() .uri("/stream") .accept(new MediaType("application", "stream+x-jackson-smile")) .retrieve() .bodyToFlux(Person.class); StepVerifier.create(result) .expectNext(new Person("foo 0")) .expectNext(new Person("foo 1")) .thenCancel() .verify(); }
@Test public void sseAsString() { Flux<String> result = this.webClient.get() .uri("/string") .accept(TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(String.class); StepVerifier.create(result) .expectNext("foo 0") .expectNext("foo 1") .expectComplete() .verify(Duration.ofSeconds(5L)); }
@Test public void sseAsPerson() { Flux<Person> result = this.webClient.get() .uri("/person") .accept(TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(Person.class); StepVerifier.create(result) .expectNext(new Person("foo 0")) .expectNext(new Person("foo 1")) .expectComplete() .verify(Duration.ofSeconds(5L)); }
@Test public void sseAsEventWithoutAcceptHeader() { Flux<ServerSentEvent<Person>> result = this.webClient.get() .uri("/event") .accept(TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(new ParameterizedTypeReference<ServerSentEvent<Person>>() {}); verifyPersonEvents(result); }
@Test public void sseAsEvent() { Assume.assumeTrue(server instanceof JettyHttpServer); Flux<ServerSentEvent<Person>> result = this.webClient.get() .uri("/event") .accept(TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(new ParameterizedTypeReference<ServerSentEvent<Person>>() {}); verifyPersonEvents(result); }