RestTemplate升级为WebClient技术

69 阅读2分钟

目前项目可以进行简单api调用

后续会需要实现各类认证请求

因此考虑升级为WebClient

原来的传统RestTemplate

在处理返回错误状态码时,采用了较为原始的字符串拼接,又因为apilog的状态码类型,后续很容易出现类型转换问题

代码如下

HttpHeaders gHeaders = new HttpHeaders();  
gHeaders.set("Content-Type", "application/json; charset=UTF-8");  
ResponseEntity<String> responseEntity = null;  
  
//封装请求Body数据  
Object body = new Object();  
HttpEntity<Object> gEntity = new HttpEntity<>(requestParams, gHeaders);  
  
//执行发送请求  
Long stime = System.currentTimeMillis();  
List list = new ArrayList();  
Map responseBody = new HashMap();  
try {  
URI uri = new URI(url);  
responseEntity = restTemplate.exchange(uri, httpMethod, gEntity, responseBodyClassType);  
//responseEntity = restTemplate.exchange(url, httpMethod, gEntity, responseBodyClassType, responseBody);  
Long etime = System.currentTimeMillis();  
list.add(responseEntity);  
ApiLogEntity apiLog = new ApiLogEntity();  
apiLog.setId(UUID.randomUUID().toString());  
apiLog.setApi_type(1);  
apiLog.setStatus(responseEntity.getStatusCode().value());  
apiLog.setResponse_data(responseEntity.getBody());  
apiLog.setRequest_time(stime);  
apiLog.setResponse_time(etime);  
apiLog.setExecute_time(etime - stime);  
list.add(apiLog);  
return list;  
} catch (Exception e) {  
String[] s = e.getMessage().split(":");  
Integer integer = Integer.valueOf(s[0].trim());  
Long etime = System.currentTimeMillis();  
ApiLogEntity apiLog = new ApiLogEntity();  
apiLog.setId(UUID.randomUUID().toString());  
apiLog.setApi_type(1);  
apiLog.setStatus(integer);  
apiLog.setRequest_time(stime);  
apiLog.setResponse_time(etime);  
apiLog.setExecute_time(etime - stime);  
apiLog.setResponse_data(e.getMessage());  
list.add(apiLog);  
return list;  
}

升级方案因为项目构建不支持异步请求,于是给出两套方案进行解决 一 采用subscribe加上CountDownLatch 将异步加上阻塞改为同步

//等待异步请求  
CountDownLatch latch = new CountDownLatch(1);  
  
//订阅返回结果  
responseMono.subscribe(  
//成功后记录日志  
responseEntity -> {  
Long etime = System.currentTimeMillis();  
list.add(responseEntity);  
  
ApiLogEntity apiLog = new ApiLogEntity();  
apiLog.setId(UUID.randomUUID().toString());  
apiLog.setApi_type(1);  
apiLog.setStatus(responseEntity.getStatusCode().value());  
apiLog.setResponse_data(responseEntity.getBody());  
apiLog.setRequest_time(stime);  
apiLog.setResponse_time(etime);  
apiLog.setExecute_time(etime - stime);  
  
list.add(apiLog);  
latch.countDown();  
}, throwable -> {  
//失败后记录日志  
Long etime = System.currentTimeMillis();  
  
ApiLogEntity apiLog = new ApiLogEntity();  
apiLog.setId(UUID.randomUUID().toString());  
apiLog.setApi_type(1);  
if (throwable instanceof WebClientResponseException) {  
WebClientResponseException responseException = (WebClientResponseException) throwable;  
HttpStatus status = responseException.getStatusCode();  
apiLog.setStatus(status.value());  
apiLog.setResponse_data(responseException.getResponseBodyAsString());  
} else {  
apiLog.setStatus(-1); // 未知错误  
apiLog.setResponse_data(throwable.getMessage());  
}  
if (throwable instanceof WebClientRequestException) {  
apiLog.setStatus(504);//超时错误  
}  
apiLog.setRequest_time(stime);  
apiLog.setResponse_time(etime);  
apiLog.setExecute_time(etime - stime);  
apiLog.setResponse_data(throwable.getMessage());  
  
list.add(apiLog);  
latch.countDown();  
});  
try {  
// 等待异步请求完成  
latch.await();  
} catch (InterruptedException e) {  
// 处理中断异常  
throw new GlobalException(HttpStatus.BAD_REQUEST,"异常中断");  
}  
return list;

但其未实现异步,导致代码可读性,与健壮性降低的同时却没有得到相应的异步提升 因此改用第二种采用webclient的同步block

ResponseEntity<String> responseEntity = null;  
try {  
responseEntity = responseMono.block();  
Long etime = System.currentTimeMillis();  
list.add(responseEntity);  
ApiLogEntity apiLog = new ApiLogEntity();  
apiLog.setId(UUID.randomUUID().toString());  
apiLog.setApi_type(1);  
apiLog.setStatus(responseEntity.getStatusCode().value());  
apiLog.setResponse_data(responseEntity.getBody());  
apiLog.setRequest_time(stime);  
apiLog.setResponse_time(etime);  
apiLog.setExecute_time(etime - stime);  
list.add(apiLog);  
return list;  
} catch (Exception e) {  
Long etime = System.currentTimeMillis();  
ApiLogEntity apiLog = new ApiLogEntity();  
  
if (e instanceof WebClientResponseException) {  
WebClientResponseException responseException = (WebClientResponseException) e;  
HttpStatus status = responseException.getStatusCode();  
apiLog.setStatus(status.value());  
apiLog.setResponse_data(responseException.getResponseBodyAsString());  
} else {  
apiLog.setStatus(-1); // 未知错误  
apiLog.setResponse_data(e.getMessage());  
}  
if (e instanceof WebClientRequestException) {  
apiLog.setStatus(504);//超时错误  
apiLog.setResponse_data(e.getMessage());  
}  
  
apiLog.setId(UUID.randomUUID().toString());  
apiLog.setApi_type(1);  
apiLog.setRequest_time(stime);  
apiLog.setResponse_time(etime);  
apiLog.setExecute_time(etime - stime);  
apiLog.setResponse_data(e.getMessage());  
list.add(apiLog);  
return list;  
}