Java转发三方下载接口,实现封装

该篇文章详细描述了如何在SpringMVC中使用Java代码处理GET请求,接收文件URL、内容类型等参数,并实现文件的下载。涉及到Base64解码、URL连接、输入/输出流操作等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@RequestMapping(value = "/getContent", method = RequestMethod.GET)
public void getContent(@RequestParam("fileUrl") String fileUrl, @RequestParam("fileFormat") String contentType,
                       @RequestParam("certificateType") String name, @RequestParam("noLength") String noLength) throws IOException {
    fileUrl = Base64Util.decode(fileUrl);

    if (StringUtil.isNotBlank(fileUrl)) {
        InputStream content = null;
        int bytesum = 0;
        int byteread = 0;
        URL url = new URL(fileUrl);//目标地址
        try {
            URLConnection conn = url.openConnection();
            content = conn.getInputStream();
            OutputStream fs = response.getOutputStream();
            String nametype = name + "." + contentType.toLowerCase();
            response.setHeader("Content-Disposition", "attachment;filename=" + new String(nametype.getBytes("gb2312"), "ISO8859-1")); //返回的文件名设置一下编码
            response.setHeader("Content-Type", "ofd");
            byte[] buffer = new byte[1204];
            int length;
            while ((byteread = content.read(buffer)) != -1) {
                bytesum += byteread;
                fs.write(buffer, 0, byteread); //直接把输出流进行写出
            }
        }  catch (Exception e) {
            e.printStackTrace();
        }
    }
}
### Java 中调用第三方接口时的回滚解决方案 当涉及到多个子系统之间的交互,尤其是跨服务或微服务架构中的操作,确保一致性是一个复杂的问题。对于Java应用程序而言,在调用第三方接口过程中遇到错误并需要执行回滚的情况下,可以采用多种策略和技术来处理这个问题。 #### 使用本地消息表模式 一种常见的做法是在数据库中创建一张专门用于存储待确认的消息记录表。每当发起一次对外部系统的请求前,先将相关信息写入此表;一旦外部调用失败,则依据这些预先保存的数据来进行补偿性的逆向操作或是重试逻辑[^3]。 ```sql CREATE TABLE IF NOT EXISTS message_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY, service_name VARCHAR(255), operation_type ENUM('INSERT', 'UPDATE', 'DELETE'), payload TEXT, status ENUM('PENDING', 'SUCCESSFUL', 'FAILED') DEFAULT 'PENDING', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` #### 实现基于Saga模式的服务编排 另一种更为结构化的方法是引入Saga模式——这是一种长运行事务管理方式,它允许一系列独立但相互关联的操作按顺序依次完成。每个单独的动作都设计成幂等(idempotent),即多次执行相同命令的结果不变。如果某个环节出现问题,后续步骤会被跳过,并启动相应的恢复程序去撤销之前已完成的部分工作。 ```java public class SagaOrchestrator { private final List<SagaStep> steps; public void execute() throws Exception { try { for (var step : steps) { step.apply(); } } catch (Exception e) { rollback(steps.subList(0, steps.indexOf(step))); throw e; // Re-throw exception after rollback. } } private void rollback(List<SagaStep> executedSteps) { Collections.reverse(executedSteps); for (var step : executedSteps) { step.compensate(); } } } ``` #### 利用分布式事务协调器(TCC/XA) 对于更严格的一致性需求场景下,还可以考虑借助成熟的分布式事务框架如TCC(Try Confirm Cancel)、XA协议等工具。这类技术能够提供更强有力的支持以保证不同资源间的同步更新行为。不过值得注意的是它们往往伴随着较高的性能开销以及额外的学习成本[^1]。 通过上述三种途径之一或者组合应用,可以在很大程度上缓解甚至彻底解决问题所描述的现象,从而提高整个业务流程的安全性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代衡_Monster

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

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

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

打赏作者

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

抵扣说明:

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

余额充值