.onStatus(s -> s != HttpStatus.OK, response -> { return parse(response).map(userInfoErrorResponse -> { String description = userInfoErrorResponse.getErrorObject().getDescription();
@Test public void shouldApplyCustomStatusHandler() { prepareResponse(response -> response.setResponseCode(500) .setHeader("Content-Type", "text/plain").setBody("Internal Server error")); Mono<String> result = this.webClient.get() .uri("/greeting?name=Spring") .retrieve() .onStatus(HttpStatus::is5xxServerError, response -> Mono.just(new MyException("500 error!"))) .bodyToMono(String.class); StepVerifier.create(result) .expectError(MyException.class) .verify(Duration.ofSeconds(3)); expectRequestCount(1); expectRequest(request -> { assertEquals("*/*", request.getHeader(HttpHeaders.ACCEPT)); assertEquals("/greeting?name=Spring", request.getPath()); }); }
@Test public void shouldApplyCustomStatusHandlerParameterizedTypeReference() { prepareResponse(response -> response.setResponseCode(500) .setHeader("Content-Type", "text/plain").setBody("Internal Server error")); Mono<String> result = this.webClient.get() .uri("/greeting?name=Spring") .retrieve() .onStatus(HttpStatus::is5xxServerError, response -> Mono.just(new MyException("500 error!"))) .bodyToMono(new ParameterizedTypeReference<String>() {}); StepVerifier.create(result) .expectError(MyException.class) .verify(Duration.ofSeconds(3)); expectRequestCount(1); expectRequest(request -> { assertEquals("*/*", request.getHeader(HttpHeaders.ACCEPT)); assertEquals("/greeting?name=Spring", request.getPath()); }); }
.onStatus(s -> s != HttpStatus.OK, response -> { return parse(response).map(userInfoErrorResponse -> { String description = userInfoErrorResponse.getErrorObject().getDescription();
.onStatus(HttpStatus::is4xxClientError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(ClientResponseException::new) .onStatus(HttpStatus::is5xxServerError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(ClientResponseException::new) .onStatus(HttpStatus::is3xxRedirection, clientResponse -> Mono.error(new RedirectException(clientResponse.headers().header("Location").get(0)))) .bodyToMono(String.class) .doOnSuccess(result -> this.addUtxo(bitcoinAccount, result))
.uri(this.url, address, new BigDecimal("1000000000000000000")) .retrieve() .onStatus(HttpStatus::is4xxClientError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(ClientResponseException::new) .onStatus(HttpStatus::is5xxServerError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(ClientResponseException::new) .onStatus(HttpStatus::is3xxRedirection, clientResponse -> Mono.error(new RedirectException(clientResponse.headers().header("Location").get(0)))) .bodyToMono(String.class) .doOnSuccess(faucetResponseDto -> ethereumAccount.setNonce(null != nonce?nonce:BigInteger.ZERO))
private void redirectPost(EthereumAccount ethereumAccount, String uri, BigInteger nonce) { this.webClient .post() .uri(uri) .contentType(MediaType.APPLICATION_JSON_UTF8) .retrieve() .onStatus(HttpStatus::is4xxClientError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(String::new) .map(ClientResponseException::new) ) .onStatus(HttpStatus::is5xxServerError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(String::new) .map(ClientResponseException::new) ) .bodyToMono(String.class) .doOnSuccess(faucetResponseDto -> ethereumAccount.setNonce(null != nonce?nonce:BigInteger.ZERO)) .doOnError(RuntimeException::new) .block(); }
private void redirectPost(BitcoinAccount bitcoinAccount, String uri) { this.webClient .post() .uri(uri) .contentType(MediaType.APPLICATION_JSON_UTF8) .retrieve() .onStatus(HttpStatus::is4xxClientError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(String::new) .map(ClientResponseException::new) ) .onStatus(HttpStatus::is5xxServerError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(String::new) .map(ClientResponseException::new) ) .bodyToMono(String.class) .doOnSuccess(result -> this.addUtxo(bitcoinAccount, result)) .doOnError(RuntimeException::new) .block(); }
private void getFees() { BitcoinFeesRecommended recommended = this.webClient.get().retrieve() .onStatus(HttpStatus::is4xxClientError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(String::new) .map(BitcoinFeesRequestFailedException::new) ) .onStatus(HttpStatus::is5xxServerError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(String::new) .map(BitcoinFeesRequestFailedException::new) ) .bodyToMono(BitcoinFeesRecommended.class).block(); if (null != recommended) { this.priority = BigInteger.valueOf(recommended.getFastestFee()); this.normal = BigInteger.valueOf(recommended.getHalfHourFee()); this.economy = BigInteger.valueOf(recommended.getHourFee()); } }
private void getGases() { EthGasAPI ethGasAPI = this.webClient.get().retrieve() .onStatus(HttpStatus::is4xxClientError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(String::new) .map(EthGasStationRequestFailedException::new) ) .onStatus(HttpStatus::is5xxServerError, clientResponse -> clientResponse .bodyToMono(ByteArrayResource.class) .map(ByteArrayResource::getByteArray) .map(String::new) .map(EthGasStationRequestFailedException::new) ) .bodyToMono(EthGasAPI.class).block(); if (null != ethGasAPI) { this.priority = BigInteger.valueOf(ethGasAPI.getFastest().longValue()); this.normal = BigInteger.valueOf(ethGasAPI.getFast().longValue()); this.economy = BigInteger.valueOf(ethGasAPI.getAverage().longValue()); } }
@Override public Publisher<Object> executeRequest(ReactiveHttpRequest request) { ReactiveHttpRequest requestPreprocessed = requestInterceptor.apply(request); logger.logRequest(methodTag, requestPreprocessed); long start = System.currentTimeMillis(); WebClient.ResponseSpec response = webClient.method(requestPreprocessed.method()) .uri(requestPreprocessed.uri()) .headers(httpHeaders -> setUpHeaders(requestPreprocessed, httpHeaders)) .body(provideBody(requestPreprocessed)) .retrieve() .onStatus(httpStatus -> true, resp -> handleResponseStatus(metadata.configKey(), resp, start)); if (returnPublisherType == Mono.class) { return response.bodyToMono(returnActualType).map(responseLogger(start)); } else { return response.bodyToFlux(returnActualType).map(responseLogger(start)); } }
private void testOnStatus(Throwable expected, Function<ClientResponse, Mono<? extends Throwable>> exceptionFunction) { HttpStatus errorStatus = HttpStatus.BAD_GATEWAY; this.server.enqueue(new MockResponse() .setResponseCode(errorStatus.value()) .setHeader("Content-Type", "application/json") .setChunkedBody("{\"error\" : {\"status\" : 502, \"message\" : \"Bad gateway.\"}}", 5)); Mono<String> mono = this.webClient.get() .uri("/json").accept(MediaType.APPLICATION_JSON) .retrieve() .onStatus(status -> status.equals(errorStatus), exceptionFunction) .bodyToMono(String.class); StepVerifier.create(mono).expectErrorSatisfies(actual -> assertSame(expected, actual)).verify(DELAY); assertEquals(1, this.server.getRequestCount()); }