谈对接多个第三方平台时的代码分层

最近做的项目均涉及到对接多个第三方平台。来谈谈对于对接第三方平台的代码分层。

有些平台会提供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工具类可阅读此文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

l去留无心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值