springBoot + 工厂模式 实现 快递鸟、顺丰和快递100的物流查询

这篇具有很好参考价值的文章主要介绍了springBoot + 工厂模式 实现 快递鸟、顺丰和快递100的物流查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

在Spring Boot中实现快递鸟、顺丰和快递100的物流查询功能通常需要与它们提供的API进行交互。当然使用他们的API 我们是需要申请和注册,从而去拿到 key 来进行调用。所以为注册的必须先进行注册,以下是他们的官网地址,可以快捷到达。

快递鸟官网:快递鸟 - 快递查询接口_免费快递查询api接口 (kdniao.com)

顺丰快递官网:顺丰开放平台 (sf-express.com) 接口名为:物流轨迹查询接口

快递100官网:快递物流接口文档_电子面单接口文档_快递100api接口文档 (kuaidi100.com)

为了实现这一功能,可以创建一个工厂类,用于封装不同快递查询服务的逻辑,并为每个服务创建一个实现类。以下是一个简单的示例,演示如何在Spring Boot中创建这些类和实现快递查询功能。

1. 创建工厂类

首先,创建一个工厂类,该类根据不同的快递服务创建对应的查询实例。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ExpressServiceFactory {

    private final Kuaidi100Service kuaidi100Service;
    private final KdniaoService kdniaoService;
    private final ShunfengService shunfengService;

    @Autowired
    public ExpressServiceFactory(Kuaidi100Service kuaidi100Service, KdniaoService kdniaoService, ShunfengService shunfengService) {
        this.kuaidi100Service = kuaidi100Service;
        this.kdniaoService = kdniaoService;
        this.shunfengService = shunfengService;
    }

    public ExpressService getExpressService(String provider) {
        switch (provider) {
            case "kuaidi100":
                return kuaidi100Service;
            case "kdniao":
                return kdniaoService;
            case "shunfeng":
                return shunfengService;
            default:
                throw new IllegalArgumentException("Invalid provider: " + provider);
        }
    }
}

2. 创建接口和实现类

接下来,为每个快递服务创建一个接口和实现类,分别实现快递查询的逻辑。以下是示例代码:

快递100 (Kuaidi100)

import org.springframework.stereotype.Service;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Map;

@Service
public class Kuaidi100Service implements ExpressService {
    
    @Autowired
    private RestTemplate restTemplate;

    @Override
    public ExpressInfo queryExpress(String trackingNumber) {
        // 调用Kuaidi100的API,查询物流信息
        // 以下是伪代码,实际中需要调用Kuaidi100的API并解析返回的数据
        String apiUrl = "https://api.kuaidi100.com/query";
        String apiKey = "your_api_key";
        
        // 构建请求参数
        Map<String, String> params = new HashMap<>();
        params.put("com", "your_com_code");  // 快递公司编码
        params.put("num", trackingNumber);   // 快递单号
        params.put("key", apiKey);           // API密钥,可以使用@Vaer注解配置在yaml
        
        // 发送HTTP请求并获取响应
        ResponseEntity<String> response = restTemplate.getForEntity(apiUrl, String.class, params);
        
        if (response.getStatusCode() == HttpStatus.OK) {
            // 解析返回的JSON数据,构建ExpressInfo对象
            String responseBody = response.getBody();
            ExpressInfo expressInfo = parseKuaidi100Response(responseBody);
            return expressInfo;
        } else {
            throw new RuntimeException("Failed to query Kuaidi100: " + response.getStatusCode());
        }
    }

    private ExpressInfo parseKuaidi100Response(String responseBody) {
        // 解析Kuaidi100返回的JSON数据并构建ExpressInfo对象的逻辑
        // 以下是示例代码,实际中需要根据API返回的数据结构进行解析
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            Kuaidi100Response kuaidi100Response = objectMapper.readValue(responseBody, Kuaidi100Response.class);
            ExpressInfo expressInfo = new ExpressInfo();
            expressInfo.setTrackingNumber(kuaidi100Response.getTrackingNumber());
            expressInfo.setLogisticsStatus(kuaidi100Response.getLogisticsStatus());
            expressInfo.setLogisticsDetail(kuaidi100Response.getLogisticsDetail());
            return expressInfo;
        } catch (IOException e) {
            throw new RuntimeException("Failed to parse Kuaidi100 response", e);
        }
    }
}

快递鸟 (Kdniao)

import org.springframework.stereotype.Service;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.MultiValueMap;

@Service
public class KdniaoService implements ExpressService {

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public ExpressInfo queryExpress(String trackingNumber) {
        // 调用快递鸟的API,查询物流信息
        // 以下是伪代码,实际中需要调用Kdniao的API并解析返回的数据
        String apiUrl = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
        String apiKey = "your_api_key";

        // 构建请求参数
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("ShipperCode", "your_shipper_code");  // 快递公司编码
        params.add("LogisticCode", trackingNumber);       // 快递单号
        params.add("RequestType", "1002");               // 查询方式
        params.add("apiKey", apiKey);

        // 发送HTTP请求并获取响应
        ResponseEntity<String> response = restTemplate.postForEntity(apiUrl, params, String.class);

        if (response.getStatusCode() == HttpStatus.OK) {
            // 解析返回的XML数据,构建ExpressInfo对象
            String responseBody = response.getBody();
            ExpressInfo expressInfo = parseKdniaoResponse(responseBody);
            return expressInfo;
        } else {
            throw new RuntimeException("Failed to query Kdniao: " + response.getStatusCode());
        }
    }

    private ExpressInfo parseKdniaoResponse(String responseBody) {
        // 解析Kdniao返回的XML数据并构建ExpressInfo对象的逻辑
        // 以下是示例代码,实际中需要根据API返回的数据结构进行解析
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder;
        Document doc;

        try {
            builder = factory.newDocumentBuilder();
            doc = builder.parse(new InputSource(new StringReader(responseBody)));
        } catch (Exception e) {
            throw new RuntimeException("Failed to parse Kdniao response", e);
        }

        // 解析XML数据并构建ExpressInfo对象
        ExpressInfo expressInfo = new ExpressInfo();
        // 根据XML结构解析数据并设置到ExpressInfo对象中
        return expressInfo;
    }
}

顺丰 (Shunfeng)

import org.springframework.stereotype.Service;

@Service
public class ShunfengService implements ExpressService {

    @Override
    public ExpressInfo queryExpress(String trackingNumber) {
        // 调用顺丰的API,查询物流信息
        // 以下是伪代码,实际中需要调用顺丰的API并解析返回的数据
        String apiUrl = "https://api.sf-express.com/std/service";
        String apiKey = "your_api_key";
        
        // 构建请求参数
        Map<String, Object> params = new HashMap<>();
        params.put("tracking_number", trackingNumber);
        params.put("api_key", apiKey);
        
        // 发送HTTP请求并获取响应
        ResponseEntity<String> response = restTemplate.postForEntity(apiUrl, params, String.class);
        
        if (response.getStatusCode() == HttpStatus.OK) {
            // 解析返回的JSON数据,构建ExpressInfo对象
            String responseBody = response.getBody();
            // 解析JSON数据并构建ExpressInfo对象
            ExpressInfo expressInfo = parseShunfengResponse(responseBody);
            return expressInfo;
        } else {
            throw new RuntimeException("Failed to query Shunfeng: " + response.getStatusCode());
        }
    }

    private ExpressInfo parseShunfengResponse(String responseBody) {
        // 解析顺丰API响应的JSON数据
        try {
            // 解析JSON数据,具体字段和格式需要根据顺丰API文档来定义
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode root = objectMapper.readTree(responseBody);

            // 检查响应状态
            String status = root.get("status").asText();
            if ("OK".equals(status)) {
                // 从响应中提取物流信息
                JsonNode dataNode = root.get("data");
                String trackingNumber = dataNode.get("tracking_number").asText();
                String deliveryStatus = dataNode.get("delivery_status").asText();
                String lastUpdateTime = dataNode.get("last_update_time").asText();

                // 构建ExpressInfo对象
                ExpressInfo expressInfo = new ExpressInfo();
                expressInfo.setTrackingNumber(trackingNumber);
                expressInfo.setDeliveryStatus(deliveryStatus);
                expressInfo.setLastUpdateTime(lastUpdateTime);

                return expressInfo;
            } else {
                // 响应中包含错误信息
                String errorMsg = root.get("message").asText();
                throw new RuntimeException("Shunfeng API error: " + errorMsg);
            }
        } catch (IOException e) {
            // 处理解析错误
            throw new RuntimeException("Failed to parse Shunfeng API response", e);
        }
    }
}

3. 创建接口

创建一个通用的快递查询服务接口,以便在工厂类中使用。

public interface ExpressService {

    /**
     * 根据快递单号查询快递物流信息
     * @param trackingNumber  快递单号
     * @return 快递物流信息
     */
    ExpressInfo queryExpress(String trackingNumber);
}

4. 使用工厂类查询物流信息

在你的控制器或服务类中,使用工厂类来获取适当的快递查询服务实例,并查询物流信息。

@RestController
public class ExpressController {

    private final ExpressServiceFactory expressServiceFactory;

    @Autowired
    public ExpressController(ExpressServiceFactory expressServiceFactory) {
        this.expressServiceFactory = expressServiceFactory;
    }


     /**
     * 根据快递类型和单号查询快递物流信息
     * @param provider 快递类型
     * @param trackingNumber  快递单号
     * @return 快递物流信息
     */
    @GetMapping("/query-express")
    public ExpressInfo queryExpress(@RequestParam String provider, @RequestParam String trackingNumber) {
        ExpressService expressService = expressServiceFactory.getExpressService(provider);
        return expressService.queryExpress(trackingNumber);
    }
}

到这里代码就写好!!!接下来就可以进行测试或者前端调用接口!!!

如果对你有用就点个赞或者关注一下吧!springBoot + 工厂模式 实现 快递鸟、顺丰和快递100的物流查询文章来源地址https://www.toymoban.com/news/detail-747318.html

到了这里,关于springBoot + 工厂模式 实现 快递鸟、顺丰和快递100的物流查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ecshop配送方式里同时出现两个顺丰快递的解决方法

    ecshop配送方式里同时出现两个顺丰快递问题; 这是因为顺丰快递的配送插件那区域设置重复了 留下一个全国即可解决问题 ECShop提交订单时配送方式多显示出一个空白块 ECShop提交订单时配送方式多显示出一个空白块,那就是选中的宝贝加入到购物车后到结算中心的时候在而配

    2023年04月16日
    浏览(45)
  • 快递物流管理系统的设计与实现(SSM,MySQL)

    系统功能分析 本系统实现一个快递物流管理系统,分为管理员、用户、车辆管理员和订单管理员四种用户。具体功能描述如下: 管理员模块包括: 1.个人中心:管理员可以修改自己的登录密码,修改自己的信息。 2.用户管理:管理员可以对用户信息进行添加、查看、审核

    2024年02月09日
    浏览(43)
  • 万物皆可集成系列:低代码对接阿里物流API实现快递跟踪

    随着各大电商网购平台的发展,快递业已形成一个规模庞大的产业,据统计,全球快递企业已超过千家,而快递查询对于电商平台而言是最基础的功能之一,通过输入快递单号,不用区分具体是哪家快递公司,即可查询到快递的实时状态。目前的主流方法都是调用第三方快递

    2024年02月16日
    浏览(42)
  • 无人机快递(物流)技术方案,无人机快递(物流)基础知识

    无人机快递技术是一种利用无人机进行快递配送的先进技术。通过利用无人机,快递企业能够在偏远地区或难以通行的地区提供配送服务,同时提高配送效率并降低人力成本。 无人机基本情况 无人驾驶飞机简称“无人机”,是利用无线电遥控设备和自备的程序控制装置操纵

    2024年02月22日
    浏览(50)
  • 如何使用Postman快速简单的调用快递物流平台快递鸟API接口

    快递鸟是一家聚合类的第三方快递物流平台,目前该平台提供的产品主要以API为主。由于API不能直观的看到产品效果,需要进行API对接联调成功后才能真实的看到产品的实际效果。但是如果一上来就写代码进行对接,耗费的时间长不说,而且还得会写代码才行,对前期的调研

    2023年04月08日
    浏览(46)
  • 基于jsp,ssm物流快递管理系统

    开发工具:eclipse,jdk1.8 服务器:tomcat7.0 数据库:mysql5.7 技术: spring+springMVC+mybaits+EasyUI 项目包括用户前台和管理后台两部分,功能介绍如下:  一、用户(前台)功能: 用户进入物流快递管理系统后,可以进行在线下单,下单完成后,可以查询订单状态;接着,用户可以浏览

    2024年02月06日
    浏览(47)
  • 菜鸟、京东物流再提速,快递业卷出新高度

    随着行业的成熟,物流快递行业的服务效率之争再次提速。3月31日,天猫超市宣布在杭州启动半日达服务,这意味着其快递包裹从下单到签收仅需半天。据公开资料显示,此次半日达服务从2022年底就开始筹备了。作为天猫超市的物流合作方,菜鸟提出了“1212”物流履约模式

    2023年04月23日
    浏览(47)
  • java+jsp企业物流货运快递管理系统servlet

    功能需求具体描述: (1)用户功能模块包括用户登录注册,用户信息的修改,用户发布货物信息,给客服人员留言,对运输公司进行评价。 (2)企业功能模块包括企业注册登录,企业信息的修改,受理用户发布的货物,订单查看,评价查看,给客服人员留言。 (3)评价功能模块主

    2024年02月02日
    浏览(44)
  • 县村快递物流小程序 v1.2.63+前端(本站修复版)

    🎈 限时活动领体验会员:可下载程序+网创项目+短视频素材 🎈 🎉 有需要的朋友记得关+赞+评,文章底部来交流!!! 🎉 ✨ 源码介绍 核心功能: 1、县分拣中心入库出库 2、司机取送 3、村驿站入库 4、用户支付取件出库 5、司机、驿站分成、提现 6、用户手机端查件 免责

    2024年02月08日
    浏览(36)
  • 华为OD机试真题 Java 实现【快递投放问题】【2023 B卷 100分】,附详细解题思路

    有N个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递。 第一行输入M N,M个包裹N个道路信息。 0=M,N=100,检查站禁止通行的包裹如果有多个以空格

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包