记录一个接口. 接口同时传输参数和很多流的情况

2023-10-27

        和一个保险系统的对接. 文本类型的参数咱不多说, 因为接口数据源是保险订单和保险理赔, 所以需要传输一些图片和视频信息, 比如说合同发票,定损图片和视频等等.  这种需求的处理比较合适的方案是约定一个FTP/SFTP服务器, 然后参数中还传递文件的路径和名称, 然后接收方在接到推送之后,可以开异步或者放到MQ里面去慢慢下载.  提了建议,然而并没有什么卵用. 就直接传流呗, 而且还是存在同一个字段多个图片的情况, 比如说定损图片, 可能存在多张, 不确定, 那么这边存储的话就需要分表了, 单据和图片子表的根据单据类型(订单和理赔)和ID关联.

        另外, 本公司(入职一年才交社保的公司)有专门提供给外面调用的SDK, 意思是写完接收接口, 还得在SDK里面把推送数据的业务完成, 然后给外面直接调用SDK的方法就完事了.

        上代码, 省去授权部分

//Controller层
    /**
    *resources 接收实体
    *type1-4Imp 接收图片和视频参数
    *
    **/
    @PostMapping("/receDate")
    @ApiOperation("***")
    @AnonymousAccess
    public ResponseEntity<Object> receDate(xx resources , 
                                         List<MultipartFile> type1Imp,
                                         List<MultipartFile> type2Imp,
                                         List<MultipartFile> type3Imp, 
                                         List<MultipartFile> type4Imp){
        HttpServletRequest httpServletRequest = RequestHolder.getHttpServletRequest();
        // httpServletRequest授权用的
        return xxService.create(resources, type1Imp, type2Imp, type3Imp,      type4Imp, httpServletRequest);
    }


//Service层
    public ResponseEntity create(xx resources ,  
                                 List<MultipartFile> type1Imp,
                                 List<MultipartFile> type2Imp,
                                 List<MultipartFile> type3Imp,
                                 List<MultipartFile> type4Imp,  
                                 HttpServletRequest httpServletRequest) {
        //... 授权处理
        
        //根据唯一ID判断是更新还是新增
            1. 新增:
                保存xx,返回ID
                备份流到OSS存储返回文件地址
                保存子表type1Imp-type4Imp路径, 
            2. 更新:
                查出子表存在的文件, 删除OSS文件和子表记录
                更新xx, 保存携带的流信息
    }

SDK引了两个包
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.11</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.11</version>
        </dependency>

SDK方法
    /**
    * url推送地址
    * param文本类型参数
    * cookies
    * header 请求头
    * inputSs 文件流集合 外层key对应接口接收字段名, 内层key可以是文件名称或者文件链接, 看需求
    **/
public String sendFilePost(String url, Map<String,String> param, Map<String,String> cookie, Map<String,String> header, Map<String , Map<String, InputStream>> inputSs) throws Exception {
        logger.info("请求地址:"+url);
        HttpPost postMethod = new HttpPost(url);
        if(header!=null && header.size()>0){
            for(String key: header.keySet()){
                postMethod.addHeader(key,header.get(key));
            }
        }
        postMethod = HttpPostGetUtil.postParams(postMethod);
        
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setCharset(java.nio.charset.Charset.forName("UTF-8"));
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        if(inputSs != null && inputSs.size() > 0){
            for(String type:inputSs.keySet()){
                Map<String, InputStream> stringInputStreamMap = inputSs.get(type);
                if(stringInputStreamMap.size() > 0){
                    for(String fileName: stringInputStreamMap.keySet()){
                        builder.addBinaryBody(type, stringInputStreamMap.get(fileName), ContentType.MULTIPART_FORM_DATA, fileName);// 文件流 
                    }
                }else{
                    continue;
                }
            }   
        }
        //解决中文乱码
        ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
        for(String key:param.keySet()){ // 字段没值不传,
            if(param.get(key)!=null && param.get(key).length()>0){
                builder.addTextBody(key, param.get(key), contentType);
            }
        }
        
        HttpEntity entity = builder.build();
        postMethod.setEntity(entity);

        if(cookie!=null && cookie.size()>0){
            StringBuffer cookieStr = new StringBuffer("");
            for(String key: cookie.keySet()){
                cookieStr.append(key).append("=").append(cookie.get(key)).append(";");
            }
            postMethod.setHeader("Cookie", cookieStr.toString());
        }

        //发送请求        
        CloseableHttpResponse  response = httpclient().execute(postMethod);
//都是伪代码, 提供思路


测试SDK调用:
  
    
 
    public static void bdTest2() throws Exception {
        YwServiceI ywServiceI=new YwServiceI();
        
        ...省去授权部分

        Map<String,String> params=new HashMap<String,String>();
        params.put("xx1","123");
        ...加工文本类型参数
        params.put("xxn","nnn");
     

        File f1=new File("D:\\a.txt"); //f1
        File f2=new File("D:\\b.txt"); //f2
        File f3=new File("D:\\c.txt"); //f3
        File f4=new File("D:\\d.txt"); //f4

        File f11=new File("D:\\aa.txt"); //f11
        File f22=new File("D:\\bb.txt"); //f22
        File f33=new File("D:\\cc.txt"); //f33
        File f44=new File("D:\\dd.txt"); //f44
        
        //加工数据流
        Map<String, InputStream> x1= new HashMap<>(); 
        x1.put("http://a.a.a/a.png",new FileInputStream(f1));  //图片链接放到key中
        x1.put("http://aa.aa.aa/aa.png",new FileInputStream(f11));

        Map<String, InputStream> x2= new HashMap<>();
        x2.put("f2.fileurl",new FileInputStream(f2));
        x2.put("f22.QWE",new FileInputStream(f22));

        Map<String, InputStream> x3= new HashMap<>();
        x3.put("f3.XXX",new FileInputStream(f3));
        x3.put("f33",new FileInputStream(f33));

        Map<String, InputStream> x4= new HashMap<>();
        x4.put("f4.fileurl",new FileInputStream(f4));
        x4.put("f44.fileurl",new FileInputStream(f44));
       
        Map<String, Map<String, InputStream>> impMap= new HashMap<>();
        impMap.put("type1Imp",x1);  //主要这几个key要和接口接收的方法参数名保持一致
        impMap.put("type2Imp",x2);
        impMap.put("type3Imp",x3);
        impMap.put("type4Imp",x4);

        //推送数据
        String s =  ywServiceI.sendFilePost("http://localhost/xxx", params, null, header, impMap);
    }

 中间还有一个小插曲, 调试过程中, 对方图片数据流不是太容易获取到, 我说不行的话你可以先用这个方法试下, 因为有图片的网络地址,也是要传过来的,  试了下可以, 然后又觉得传的流太多了, 能不能地址传过来后我这边通过这个方式取流上传.  那咋可能呀兄弟, 第一我频发的请求图片服务, 你们给我限制, 甚至告了咋办,也没得授权.  第二一开始就提出了别的方案, 你们也不考虑呀 第三 这种不靠谱的流程他就是不靠谱 第四, 我接口接收之后 上传OSS用的MultipartFile格式, 那我还得转换.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录一个接口. 接口同时传输参数和很多流的情况 的相关文章

随机推荐

  • STM32_中断系统_概述

    1 中断的基本概念 2 NVIC 嵌套向量控制器 中断及异常向量表 3 中断优先级 1 中断的基本概念 1 1处理器中的中断 在处理器中 CPU正在执行某一段代码时遇到内部或者外部的紧急事件需要处理 暂停当前执行的代码 转而去处理紧急事件
  • React中jsx或tsx的switch语句使用

    React中jsx或tsx的switch语句使用 gt switch case case 1 return break case 2 return break
  • SRM系统选择哪种部署方式?

    传统线下采购模式存在过程不透明 合规性差 沟通效率低且采购成本高等痛点 随着互联网技术不断发展 国内以阿里云 腾讯云 华为云为代表的丛多互联网企业都提供了上云基础服务 IAAS 各种SaaS管理软件也逐渐被中国企业接受 在此背景下 近几年不
  • Qt自定义控件的使用教程

    自定义的控件无非是继承自Qt的某个类自定义的一个类 常用的是继承自QWidget类 在Qt可视化编程中 可视化编程有两种方式 第一种 使用常规的方法 创建一个该类的对象 然后加入到布局管理器中 show一下就可以看到效果了 第二种 Qt D
  • mysql innodb flush_MySQL Config--参数innodb_flush_method

    延迟写 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存 大多数磁盘I O都通过缓冲进行 当将数据写入文件时 内核通常先将该数据复制到其中一个缓冲区中 如果该缓冲区尚未写满 则并不将其排入输出队列 而是等待其写满或者当内核需要重用
  • 第七课,OpenGL之LookAt函数

    观察空间 通过给定摄像机位置 摄像机焦点 摄像机顶部分向量 可得到摄像机的固定位置 glm lookAt cameraPos cameraFocus cameraUp LookAt函数提供了这种计算 把这个LookAt矩阵作为观察矩阵可以很
  • 【C++】序

    1 数据类型 C 中有许多和C语言相似的数据类型 例如int char double 等等的数据类型 这些数据类型的使用和性质与C语言也大同小异 但在C 中也存在很多不同于C语言的数据类型 1 字符串类型 在C语言中 没有单独的字符串类型
  • 统计正数和负数的个数然后计算这些数的平均值)编写二个程序来读入不指定个数的整数,然后决定已经读取的整数中有多少个正数和多少个负数并计算这些输入值(不统计0)的总和,最终得出它们的平均值。这个程序以输入

    positives 0 negatives 0 sum 0 while True num int input Enter a number if num 0 break elif num gt 0 positives 1 正数个数 else
  • Java程序员必须要了解的七个开源协议介绍

    1 Mozilla Public License MPL License 允许免费重发布 免费修改 但要求修改后的代码版权归软件的倡议者 这种授权维护了商业软件的利益 它要求基于这种软件得修改无偿贡献 版权给该软件 这样 围绕该软件得所有代
  • c++ map 结构体作为key关键词

    c map 结构体作为key关键词 结构体的定义 这里的结构体是三个值 int x int y int label 当三个值作为 值时 你需要重新定义它的对比操作operator 这样才能对map进行查找操作 数据结构声明 并且对key的查
  • 在做课设时,用到的一个创建作业功能

    再做一个图书借阅系统的课设时 因为需要在数据库里实时更新某个人当前借阅图书的逾期天数 需要每次打开电脑都获取当前日期 再减去应还书日期 当时一直想不到一个很好的解决方法 然后在网上查了些资料 说是要用到sql server 创建作业的办法
  • Python实现自动化办公

    人工智能 AI 是当今世界最为热门的话题之一 而Python是从事AI领域最为流行的编程语言 在本文中 我将介绍如何使用Python实现自动化办公和处理工资表等知识教程 帮助您从零入门人工智能Python 一 制作Excel可视化报表 在传
  • 使用Jmeter进行性能测试

    文章目录 一 性能测试 性能测试介绍 性能指标QPS 每秒查询率 性能指标TPS 每秒处理的事务数目 QPS和TPS的不同点 二 Jmeter性能测试案例 三 Jmeter性能测试结果分析 1 如何得到可靠的测试报告 2 运行实际负载测试时
  • php苹果内购验证,苹果内购凭据验证工具(苹果支付,苹果内购,凭据解析)

    use sn01615 iap ios Verify include vendor autoload php cc new Verify receipt 凭据 cc gt endpoint true 可选 切换到沙盒环境 cc gt set
  • 生草shader的几种方法总结

    草地shader一直是shader效果的热门主题 实现草地效果 结合了集合绘制 顶点动画 光照很多shader编程的技巧 这里总结一下我在网上查到博客的几种实现方案 我居然拖了一年还没有写完 woc 反正也没有人看 先发一个 第一位是che
  • 怎么采集dedecms自定义内容模型

    有时我们需要用到dedecms提供的自定义内容模型功能去添加自定义内容模型来满足需求 那么dedecms自定义内同模型怎么添加采集规则呢 打开 dede templets co add step0 htm 找到如下代码 19行左右
  • 软考高级之系统架构师之企业应用集成EAI

    概述 在企业信息化建设的过程中 由于缺乏统一规划和总体布局 往往形成多个信息孤岛 信息孤岛使数据的一致性无法得到保证 信息无法共享和反馈 需要重复多次的采集和输入 信息孤岛是企业信息化一个重要的负面因素 其主要原因既有技术因素也有管理因素
  • 云服务器创建win10虚拟机吗,云服务器创建win10虚拟机

    云服务器创建win10虚拟机 内容精选 换一换 弹性云服务器 Elastic Cloud Server 以下简称ECS 是由CPU 内存 镜像 云硬盘组成的一种可随时获取 弹性可扩展的计算服务器 同时它结合VPC 虚拟防火墙 数据多副本保存
  • 深度优先搜索(DFS)

    算法入门 郭志伟 SYSU raphealguo at qq com 2012 05 12 1 前言 深度优先搜索 缩写DFS 有点类似广度优先搜索 也是对一个连通图进行遍历的算法 它的思想是从一个顶点V0开始 沿着一条路一直走到底 如果发
  • 记录一个接口. 接口同时传输参数和很多流的情况

    和一个保险系统的对接 文本类型的参数咱不多说 因为接口数据源是保险订单和保险理赔 所以需要传输一些图片和视频信息 比如说合同发票 定损图片和视频等等 这种需求的处理比较合适的方案是约定一个FTP SFTP服务器 然后参数中还传递文件的路径和