Spring Reactive Webclient返回statusCode 404

问题描述

当我尝试使用Spring响应式Webclient对我们的下游系统之一进行GET调用时,它会向我返回statusCode404。下面是日志

2020-09-22 22:40:35,216 INFO c.s.d.r.DanamasRoute [reactor-http-epoll-2]客户端响应:org.springframework.web.reactive.function.client.DefaultClientResponse@7157ba76 2020-09-22 22:40:35,217 DEBUG c.s.d.r.DanamasRoute [reactor-http-epoll-2]响应: 状态:404 内容类型:text / html; charset = utf-8 内容语言: 内容长度:1030 日期:2020年9月22日星期二15:40:35 GMT 2020-09-22 22:40:35,275错误csdeCustomExceptionHandler [http-nio-8999-exec-6]内部服务器错误:org.springframework.web.reactive.function.client.WebClientResponseException $ NotFound:404未找到

但是,当我对下游系统执行cURL GET命令时,使用适当的JSON响应获取statusCode 200。 curl -X GET“ http://?id = 1zV1fG8aT3pI8jV0kX1f” -H“接受:application / json” {“ responseResult”:{“ responseCode”:{“ code”:“ 00”,“ description”:“找到贷款期限信息。”,“ name”:“成功”},“ result”:[{“ code”: “ 03”,“ gracePeriode”:2,“ interest”:“ 1.0%”,“ name”:“ Smart Fren”,“ penalty”:“ 0.1%”,“ tenor”:14,“ unit”:“ DAY” },{“ code”:“ 65”,“ gracePeriode”:2,“ interest”:“ 2.34235%”,“ name”:“ Reseller Smartfren”,“ penalty”:“ 0.1%”,“ tenor”:3, “ unit”:“ MONTH”}]}}

这是我的网络客户端代码

public WebClient getWebClient(String ip,String port) {

        HttpClient httpClient = HttpClient.create()
                .tcpConfiguration(client ->
                        client.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,10000)
                                .doOnConnected(conn -> conn
                                        .addHandlerLast(new ReadTimeoutHandler(2))
                                        .addHandlerLast(new WriteTimeoutHandler(2))));
        ClientHttpConnector connector = new ReactorClientHttpConnector(httpClient.wiretap(true));
        ObjectMapper mapper = new ObjectMapper();
        ExchangeStrategies strategies = ExchangeStrategies
                .builder()
                .codecs(clientDefaultCodecsConfigurer -> {
                    clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(mapper,MediaType.APPLICATION_JSON));
                    clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(mapper,MediaType.APPLICATION_JSON));
                }).build();
        webClient = WebClient.builder().exchangeStrategies(strategies);

        return webClient.baseUrl(ip + ":" + port)
                .clientConnector(connector)
                .defaultHeader(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE)
                .defaultHeader(HttpHeaders.ACCEPT,MediaType.APPLICATION_JSON_VALUE)
                .filters(exchangeFilterFunctions -> {exchangeFilterFunctions.add(logRequest());
                                                    exchangeFilterFunctions.add(logResponse());
                                                    exchangeFilterFunctions.add(errorHandlingFilter());
                }).build();
    }

public ExchangeFilterFunction errorHandlingFilter() {
        
        return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
            
            return Mono.just(clientResponse);
        });
    }

ExchangeFilterFunction logResponse() {
        return ExchangeFilterFunction.ofResponseProcessor((clientResponse -> {
            if (LOGGER.isDebugEnabled()) {
                StringBuilder sb = new StringBuilder("Response: \n")
                        .append("Status: ")
                        .append(clientResponse.rawStatusCode());
                clientResponse
                        .headers()
                        .asHttpHeaders()
                        .forEach((key,value1) -> value1.forEach(value -> sb
                                .append("\n")
                                .append(key)
                                .append(":")
                                .append(value)));
                LOGGER.debug(sb.toString());
            }
            return Mono.just(clientResponse);
        }));
    }

ExchangeFilterFunction logRequest() {
        return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
            if (LOGGER.isDebugEnabled()) {
                StringBuilder sb = new StringBuilder("Request: \n");
                //append clientRequest method and url
                clientRequest
                        .headers()
                        .forEach((name,values) -> values.forEach(value -> LOGGER.info("{}={}",name,value)));
                LOGGER.debug(sb.toString());
            }
            return Mono.just(clientRequest);
        });
    }

public TenorUnitInfoResponseBean getTenorUnitInfo(String sessionId) {
        return getWebClient(danamasIP,danamasPort)
                .get()
                .uri(uriBuilder -> uriBuilder.path(tenorUnitInfoURI)
                        .queryParam("sessionKey",sessionId)
                        .build())
                .accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .bodyToFlux(TenorUnitInfoResponseBean.class)
                .blockFirst();
    }

有人可以让我知道如何解决此问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)