最近做的项目均涉及到对接多个第三方平台。来谈谈对于对接第三方平台的代码分层。
有些平台会提供SDK,有些平台则只能通过http去调用。每个平台的授权各不相同,每个平台的入参规范不一致。如果是提供了SDK的平台,那么我们引入响应的pom或者jar,然后直接调用,入参和响应适配SDK入参即可。但是如果只能通过http调用的平台,有的入参是驼峰写法,有的入参是是下划线写法,等等。
我们一个项目的入参风格需要统一,不能说一下是驼峰,一下是下划线,而且平台可能会经常改动,这样加大了开发和维护的成本。
我们需要定义统一的入参和响应风格,因此会涉及到我们系统入参或者响应与第三方入参或者响应的转换层,为了方便代码维护,可推荐分为:
ado层,匹配平台的入参,不管是驼峰写法还是驼峰写法,入参和响应均写在这个层面;
client层,匹配平台的方法,每个平台的授权不一样,但是调用平台内的方法时,用的同一套授权,因此,这里可以将授权,post,get写在baseClient,然后具体的方法Client继承baseClient。
service层,供controller层调用的服务层,清洗并转换数据(将我们的驼峰转换成ado适配第三方系统)。
以一个平台为例:
创建订单的接口入参:
ado层
@Data
public class AllJoyCreateOrderADO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "客户参考号")
private String reference_no;
@ApiModelProperty(value = "客户端ERP")
private String from;
@ApiModelProperty(value = "运单号")
private String shipper_hawbcode;
@ApiModelProperty(value = "产品代码")
private String shipping_method;
}
baseClient
@Data
public class AllJoyBaseClient {
private String appKey;
private String appToken;
private String service;
private Map<String, String> headParams = new HashMap<>();
public AllJoyBaseClient(LogisticAlljoyUserEntity entity) {
this.sandbox = entity.getSandbox();
this.appKey = entity.getAppKey();
this.appToken = entity.getAppToken();
this.headParams = buildHead();
}
protected String post(String type, String service, String paramsJson) {
// 具体逻辑
}
/**
* 根据类型封装body
*
* @param type
* @param service
* @param paramsJson
* @return
*/
private String buildBody(String type, String service, String paramsJson) {
// 具体逻辑
}
}
具体的方法client
public class AllJoyClient extends AllJoyBaseClient {
public AllJoyClient(LogisticAlljoyUserEntity entity) {
super(entity);
}
/**
* 创建订单
*
* @param param
* @return
*/
public BaseShipmentCreateDTO createOrder(LogictisAllJoyCreateOrderParam param) {
// 封装入参
AllJoyCreateOrderADO allJoyCreateOrderADO = new AllJoyCreateOrderADO(param);
String body = JSONObject.toJSONString(allJoyCreateOrderADO);
// 处理特殊参数
String strParam = body.replaceAll("itemArr", "ItemArr")
.replaceAll("shipper_lower", "Shipper")
.replaceAll("consignee_lower", "Consignee");
// post请求
String data = super.post(AllJoyEnum.RequestEnum.CREATE.getCode(), AllJoyConstant.METHOD_lIST.CREATE_METHOD, strParam);
// 处理响应参数
String processData = super.getResData(data);
Map map = JSONObject.parseObject(processData);
BaseShipmentCreateDTO baseShipmentCreateDTO = new BaseShipmentCreateDTO();
baseShipmentCreateDTO.setShipmentNo(MapUtils.getString(map, "shipping_method_no"));
baseShipmentCreateDTO.setReferenceNo(MapUtils.getString(map, "reference_no"));
return baseShipmentCreateDTO;
}
}
service层
public interface LogisticAllJoyService {
/**
* 创建订单
*
* @param param
* @return
*/
BaseShipmentCreateDTO createOrder(LogictisAllJoyCreateOrderParam param);
}
service实现类
@Service public class LogisticAllJoyServiceImpl implements LogisticAllJoyService { @Resource private LogisticAlljoyUserService logisticAlljoyUserService; @Override public BaseShipmentCreateDTO createOrder(LogictisAllJoyCreateOrderParam param) { LogisticAlljoyUserEntity entity = logisticAlljoyUserService.getVerifyUser(param); AllJoyClient allJoyClient = new AllJoyClient(entity); // 代码转换代码省略。。 return allJoyClient.createOrder(param); }
}
欢迎大家推荐更好更易维护的方式!调用第三方的http工具类可阅读此文