如果项目是属于那种集成项目,那么对接各种第三方平台在所难免。根据亲身经历,暂定如下对接规范。
1 自定义异常
针对第三方的异常,大致可以分为第三方内部异常、第三方传入参数异常、自身调用异常、登录异常。
- 第三方内部异常:按接口文档正确录入参数,但第三方平台未返回预想结果
- 第三方传入参数异常:主要是说自身参数未校验完全,第三方抛出的参数建议,比如图片模糊
- 自身调用异常:本身在调用第三方接口时出现超时等异常,可以归于第三方内部异常
- 登录异常:其实可以归于内部异常,但为了保活方便,建议单独定义异常
2 常用请求流程
2.1 入参校验
针对入参进行空值校验、设置默认值等
2.2 拼接参数
通常会有json和xml两种形式,此过程建议使用main函数进行初步检验,不要等到部署再测试。
2.3 请求过程
建议使用如下形式:
private List<StaticPeopleDto> searchRequest(String xml) {
String staticPeoples = "";
// 当出现异常时,可以快速定位是哪个接口出错
try {
staticPeoples = client.getStaticPeoples(xml);
}catch (Exception e) {
throw new HuaWeiSysException("获取静态人员信息失败");
}
StaticPeopleRspDto rspDto = JaXmlBeanUtil.converyToJavaBean(staticPeoples, StaticPeopleRspDto.class);
// 当正常拿到返回结果后,对返回结果进行校验
HuaWeiAssert.isOk(rspDto);
List<StaticPeopleDto> peoples = rspDto.getPeoples();
return CollectionUtils.isEmpty(peoples) ? Collections.emptyList() : peoples;
}
校验工具类:
public static void isOk(ResponseDto responseDto) {
//对参数进行校验
if(responseDto==null){
throw new HuaWeiSysException("响应无可用数据");
}
//获取错误码和返回信息:resultDto也可能出现空值,小伙伴在这里也可以加空值校验
String code = responseDto.getResultDto().getCode();
String msg=responseDto.getResultDto().getErrmsg();
//成功响应码,直接返回
if (HuaWeiStatusEnum.SUCCESS.getCode().equals(code)) {
return ;
}
//登录失败响应码:直接抛出登录异常
if (HuaWeiStatusEnum.LOGIN_FAILED.getCode().equals(code)) {
throw new HuaWeiLoginException();
}
//参数错误信息
for (HuaweiArgEnum huaweiArgEnum : HuaweiArgEnum.values()) {
if (huaweiArgEnum.getCode().equals(code)) {
throw new HuaWeiArgException(huaweiArgEnum.getMsg());
}
}
//内部异常处理
for (HuaWeiStatusEnum huaWeiStatusEnum : HuaWeiStatusEnum.values()) {
if (huaWeiStatusEnum.getCode().equals(code)) {
throw new HuaWeiSysException(huaWeiStatusEnum.getMsg());
}
}
throw new HuaWeiSysException(msg);
}
2.4 结果处理
将结果拼接为己方所需的格式,特别注意连续调用时需要层层判空,可以使用Optional简化过程
2.5 建议
2.5.1 多打日志
多打日志,而且一定要注意日志级别。日志打得好,排查起来就轻松很多。
- 定义logback-spring.xml将各种日志分类输出
- catch内的异常日志级别通常打成两种:warn 允许程序继续运行 ,error 无法恢复的异常
- 详细过程信息:打为debug级别,方便排查
- 普通过程信息:打成info即可
2.5.2 原接口参数接入
无论本身业务逻辑如何,接入第三方接口时,首先应完整而纯净地接入接口,尽可能少的混入自身业务逻辑.写自身业务时,再去调已经写好校验逻辑的接口方法.这样做的好处在于:如果出现问题可以快速定位问题,而且保持接口的纯净性,也方便复用.