目前项目可以进行简单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;
}