Java Spring反应式网络客户端返回状态代码404
当我试图使用Spring Responsive webclient对下游系统之一进行GET调用时,它会返回状态码404。下面是日志 2020-09-22:40:35216信息c.s.d.r.DanamasRoute[reactor-http-epoll-2]客户端响应:org.springframework.web.reactive.function.Client。DefaultClientResponse@7157ba76 2020-09-22:40:35217调试c.s.d.r.DanamasRoute[reactor-http-epoll-2]响应: 现状:404 内容类型:text/html;字符集=utf-8 内容语言:英语 内容长度:1030 日期:2020年9月22日星期二15:40:35 GMT 2020-09-22 22:40:35275错误c.s.d.e.CustomExceptionHandler[http-nio-8999-exec-6]内部服务器错误:org.springframework.web.reactive.function.client.WebClientResponseException$NotFound:404未找到 但当我对下游系统执行cURL GET命令时,会得到带有适当JSON响应的状态码200。 curl-X GET“http://?id=1zV1fG8aT3pI8jV0kX1f”-H“accept:application/json” {“responseResult”:{“responseCode”:{“code”:“00”,“description”:“Loan tenor info found.”,“name”:“Success”},“result”:“03”,“gracePeriode”:2,“利息”:“1.0%”,“name”:“Smart Fren”,“罚金”:“0.1%”,“tenor”:“14”,“unit”:“DAY”},{“code”:“65”,“gracePeriode”:2,“利息”:“2.34235%”,“姓名”:“经销商Smartfren”,“罚金”:“0.1%”,“期限”:3,“unit”:“月”}} 这是我的网络客户端代码:Java Spring反应式网络客户端返回状态代码404,java,spring,spring-boot,webclient,reactive,Java,Spring,Spring Boot,Webclient,Reactive,当我试图使用Spring Responsive webclient对下游系统之一进行GET调用时,它会返回状态码404。下面是日志 2020-09-22:40:35216信息c.s.d.r.DanamasRoute[reactor-http-epoll-2]客户端响应:org.springframework.web.reactive.function.Client。DefaultClientResponse@7157ba76 2020-09-22:40:35217调试c.s.d.r.Danama
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();
}
有人能告诉我如何解决这个问题吗