@Test // SPR-16246 public void shouldSendLargeTextFile() throws IOException { prepareResponse(response -> {}); Resource resource = new ClassPathResource("largeTextFile.txt", getClass()); byte[] expected = Files.readAllBytes(resource.getFile().toPath()); Flux<DataBuffer> body = DataBufferUtils.read(resource, new DefaultDataBufferFactory(), 4096); this.webClient.post() .uri("/") .body(body, DataBuffer.class) .retrieve() .bodyToMono(Void.class) .block(Duration.ofSeconds(5)); expectRequest(request -> { ByteArrayOutputStream actual = new ByteArrayOutputStream(); try { request.getBody().copyTo(actual); } catch (IOException ex) { throw new IllegalStateException(ex); } assertEquals(expected.length, actual.size()); assertEquals(hash(expected), hash(actual.toByteArray())); }); }
private Mono<ClientResponse> sendRequest(WebClient webClient, String logId, Request request, HttpHeaders headers) { .uri(builder -> {
@Test(expected = IllegalArgumentException.class) public void bodyObjectPublisher() { Mono<Void> mono = Mono.empty(); WebClient client = this.builder.build(); client.post().uri("http://example.com").syncBody(mono); }
@Test public void multipartFormDataWorks() { ClassPathResource img = new ClassPathResource("1x1.png"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_PNG); HttpEntity<ClassPathResource> entity = new HttpEntity<>(img, headers); MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>(); parts.add("imgpart", entity); Mono<Map> result = webClient.post() .uri("/post") .contentType(MediaType.MULTIPART_FORM_DATA) .body(BodyInserters.fromMultipartData(parts)) .exchange() .flatMap(response -> response.body(toMono(Map.class))); StepVerifier.create(result) .consumeNextWith(map -> { Map<String, Object> files = getMap(map, "files"); assertThat(files).containsKey("imgpart"); String file = (String) files.get("imgpart"); assertThat(file).startsWith("data:").contains(";base64,"); }) .expectComplete() .verify(DURATION); }
.uri(tokenUri) .accept(MediaType.APPLICATION_JSON) .headers(headers(clientRegistration))
@Override public Mono<OAuth2AccessTokenResponse> getTokenResponse(OAuth2AuthorizationCodeGrantRequest authorizationGrantRequest) { return Mono.defer(() -> { ClientRegistration clientRegistration = authorizationGrantRequest.getClientRegistration(); OAuth2AuthorizationExchange authorizationExchange = authorizationGrantRequest.getAuthorizationExchange(); String tokenUri = clientRegistration.getProviderDetails().getTokenUri(); BodyInserters.FormInserter<String> body = body(authorizationExchange); return this.webClient.post() .uri(tokenUri) .accept(MediaType.APPLICATION_JSON) .headers(headers -> headers.setBasicAuth(clientRegistration.getClientId(), clientRegistration.getClientSecret())) .body(body) .exchange() .flatMap(response -> response.body(oauth2AccessTokenResponse())) .map(response -> { if (response.getAccessToken().getScopes().isEmpty()) { response = OAuth2AccessTokenResponse.withResponse(response) .scopes(authorizationExchange.getAuthorizationRequest().getScopes()) .build(); } return response; }); }); }
WebClient.RequestBodySpec bodySpec = instanceWebClient.instance(instance) .method(method) .uri(uri) .headers(h -> h.addAll(filterHeaders(headers)));
@Test public void postPerson() { final Mono<Person> body = webClient.post() .uri(uri("/birthday")) .contentType(MediaType.APPLICATION_JSON) .body(Mono.just(new Person("armeria", 4)), Person.class) .retrieve() .bodyToMono(Person.class); StepVerifier.create(body) .expectNext(new Person("armeria", 5)) .expectComplete() .verify(Duration.ofSeconds(10)); }
@Test public void postWorks() { Mono<Map> result = webClient.post() .uri("/post") .header("Host", "www.example.org") .syncBody("testdata") .exchange() .flatMap(response -> response.body(toMono(Map.class))); StepVerifier.create(result) .consumeNextWith(map -> assertThat(map).containsEntry("data", "testdata")) .expectComplete() .verify(DURATION); }
@Test public void shouldSendPojoAsJson() { prepareResponse(response -> response.setHeader("Content-Type", "application/json") .setBody("{\"bar\":\"BARBAR\",\"foo\":\"FOOFOO\"}")); Mono<Pojo> result = this.webClient.post() .uri("/pojo/capitalize") .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) .syncBody(new Pojo("foofoo", "barbar")) .retrieve() .bodyToMono(Pojo.class); StepVerifier.create(result) .consumeNextWith(p -> assertEquals("BARBAR", p.getBar())) .expectComplete() .verify(Duration.ofSeconds(3)); expectRequestCount(1); expectRequest(request -> { assertEquals("/pojo/capitalize", request.getPath()); assertEquals("{\"foo\":\"foofoo\",\"bar\":\"barbar\"}", request.getBody().readUtf8()); assertEquals("31", request.getHeader(HttpHeaders.CONTENT_LENGTH)); assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT)); assertEquals("application/json", request.getHeader(HttpHeaders.CONTENT_TYPE)); }); }
@Test public void requestBodyFlux() { Mono<String> result = webClient .post() .uri("/requestBodyFlux") .syncBody(generateBody()) .retrieve() .bodyToMono(String.class); StepVerifier.create(result) .consumeNextWith(body -> assertEquals( "[fieldPart,fileParts:foo.txt,fileParts:logo.png,jsonPart]", body)) .verifyComplete(); }
@Test public void modelAttribute() { Mono<String> result = webClient .post() .uri("/modelAttribute") .syncBody(generateBody()) .retrieve() .bodyToMono(String.class); StepVerifier.create(result) .consumeNextWith(body -> assertEquals( "FormBean[fieldValue,[fileParts:foo.txt,fileParts:logo.png]]", body)) .verifyComplete(); }
@Test public void requestBodyMap() { Mono<String> result = webClient .post() .uri("/requestBodyMap") .syncBody(generateBody()) .retrieve() .bodyToMono(String.class); StepVerifier.create(result) .consumeNextWith(body -> assertEquals( "Map[[fieldPart],[fileParts:foo.txt,fileParts:logo.png],[jsonPart]]", body)) .verifyComplete(); }
@Override public RequestBodySpec uri(String uriTemplate, Map<String, ?> uriVariables) { this.bodySpec.uri(uriTemplate, uriVariables); this.uriTemplate = uriTemplate; return this; }
@Override public RequestBodySpec uri(URI uri) { this.bodySpec.uri(uri); this.uriTemplate = null; return this; }
@Override public RequestBodySpec uri(Function<UriBuilder, URI> uriFunction) { this.bodySpec.uri(uriFunction); this.uriTemplate = null; return this; }
@Override public RequestBodySpec uri(String uriTemplate, Object... uriVariables) { this.bodySpec.uri(uriTemplate, uriVariables); this.uriTemplate = uriTemplate; return this; }
@Test public void parts() { Mono<ClientResponse> result = webClient .post() .uri("http://localhost:" + this.port + "/parts") .syncBody(generateBody()) .exchange(); StepVerifier .create(result) .consumeNextWith(response -> assertEquals(HttpStatus.OK, response.statusCode())) .verifyComplete(); }
@Test public void multipartData() { Mono<ClientResponse> result = webClient .post() .uri("http://localhost:" + this.port + "/multipartData") .syncBody(generateBody()) .exchange(); StepVerifier .create(result) .consumeNextWith(response -> assertEquals(HttpStatus.OK, response.statusCode())) .verifyComplete(); }
@Test public void requestPart() { Mono<ClientResponse> result = webClient .post() .uri("/requestPart") .syncBody(generateBody()) .exchange(); StepVerifier .create(result) .consumeNextWith(response -> assertEquals(HttpStatus.OK, response.statusCode())) .verifyComplete(); }