ClientResponse .class与String.class区别

提前说一下:这是在服务器端返回来的是@XMLTEXT_PLAIN字符串类型的。但在客户器端却用ClientResponse来接收。
try {

ClientResponse response = r.accept(MediaType.TEXT_PLAIN).type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, bill);
               System.out.println("测试==="+response);

               System.out.println("测试111==="+response.getStatus());

if (response.getStatus() != 200) {   //代表成功发送的状态就是200,另外只有ClientResponse对象才会有状态,而用String.class则不会有state()方法。
return URLDecoder.decode(response.getHeaders().getFirst("error"),"UTF-8");

}

return Commons.INVOKE_STATE_SUCCESS;

} catch (Exception e) {
LOG.error(e.getMessage());

return Commons.INVOKE_STATE_INTERNAL_ERROR+e.getLocalizedMessage();

}


结果:这是ClientResponse对象值:测试===POST http://localhost:8080/GZRESTClient/rest/adjust/sendAdjustBill   returned a response status of 200
         String.class对象值:sucess,即是服务端返回来的字符串而已。

      测试111===200

package com.corilead.utlis; import com.alibaba.fastjson.JSON; import com.casic.cplm.audit.dto.AuditTrailDto; import java.time.Instant; import org.springframework.http.HttpStatus; import org.springframework.web.reactive.function.client.*; import reactor.core.publisher.Mono; public class ParamFilter implements ExchangeFilterFunction { public static final String CUSTOM_PARAM_KEY = "customParam"; @Override public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) { AuditTrailDto operLog = new AuditTrailDto(); String requestBody = (String) request.attributes().getOrDefault(CUSTOM_PARAM_KEY, ""); setupBaseOperationInfo(operLog, request, requestBody); // 添加请求超时处理,设置合理的响应超时时间5秒 return next.exchange(request) .timeout(java.time.Duration.ofSeconds(5)) .flatMap( response -> response .bodyToMono(String.class) .defaultIfEmpty("[empty-body]") .doOnNext( body -> { operLog.setDescription(JSON.toJSONString(body)); operLog.setStatus(response.statusCode().value()); System.out.println("OperLog: " + operLog); }) .map(body -> response) // 修改这里确保正确返回response ) .onErrorResume(e -> handleError(e, operLog)) // 确保最终能返回一个空的ClientResponse .switchIfEmpty(Mono.just(ClientResponse.create(HttpStatus.NO_CONTENT).build())); } private void setupBaseOperationInfo( AuditTrailDto operLog, ClientRequest request, String requestBody) { operLog.setEventName("系统内部调用第三方"); operLog.setExtraParams(requestBody); operLog.setResourceType(request.method().name()); operLog.setEventTime(Instant.now()); } private Mono<ClientResponse> handleError(Throwable e, AuditTrailDto operLog) { operLog.setStatus(500); operLog.setDescription(e.getMessage()); System.out.println("Error operLog: " + operLog); // 返回友好的错误响应体 return Mono.just( ClientResponse.create(HttpStatus.INTERNAL_SERVER_ERROR) .body("{'error':'" + e.getMessage() + "'}") .build()); } } 修改代码 拦截后 接口无响应
最新发布
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值