最近在整一个定时将钉钉云盘所有文件下载下来的服务,其中因为api只能拿到单独文件的关系,因此逻辑比较绕


经过设计后,进行代码的编写;
设计逻辑:
1、首先先从apollo拿到所需的appkey和APPsecret,用于获取accesstoken,以及获取能获取到全部文件的用户的unionid。
2、获取到的unionid和token用于获取该用户云盘下的全部文件夹信息,从返回到的json信息中获取spaces内容,并序列化成列表(每个文件夹都有自己的spaceid)。
3、在应用层对spaceid列表进行遍历,对每个spaceid进行接下来的操作。
4、调用获取文件列表接口,将返回结果序列化,因为存在分页机制。如果返回结果中存在nextToken则将此参数进行再次调用,进行序列化后再对列表进行拼接。当文件类型是文件时,与表里的fileid进行一次比对,如果存在就跳过,如果不存在则存入新的list中,当文件类型是文件夹时,递归查询该文件夹下的文件,将列表返回与原列表拼接。
5、将文件列表中的fileid取出并获取下载信息,进行文件的下载,同时获取文件信息,并将文件信息中的人员id拿到人员信息,将文件转换为base64字节和人员信息一齐发送到文件下载服务,最后将文件信息存入表中。
在ddd模式的application层进行循环的编写


这里最主要的是要进行一个文件的递归,代码较长,只放出一部分抛砖引玉

public List<SortedList<string, string>> GetFileList1(string spaceId, string accessToken, string nextToken, List<SortedList<string, string>> list, string unionId, string parentId){bool flag = nextToken == null || nextToken == "";List<SortedList<string, string>> result;if (flag){Dictionary<string, string> dictionary = new Dictionary<string, string>();dictionary.Add("unionId", unionId);dictionary.Add("maxResults", "50");dictionary.Add("orderType", "createTimeDesc");dictionary.Add("parentId", parentId);string url = "https://api.dingtalk.com/v1.0/drive/spaces/" + spaceId + "/files";string text = HttpHelper.Get(url, dictionary, accessToken);SortedList<string, object> sortedList = JsonConvert.DeserializeObject<SortedList<string, object>>(text);JObject jobject = JObject.Parse(text);string nextToken1 = Convert.ToString(sortedList["nextToken"]);string value = jobject["files"].ToString();//筛选出仅有文件列表的listList<SortedList<string, string>> olist = new List<SortedList<string, string>>();olist = JsonConvert.DeserializeObject<List<SortedList<string, string>>>(value);//用于递归的列表listList<SortedList<string, string>> dlist = new List<SortedList<string, string>>();//最终拼接出的文件列表listList<SortedList<string, string>> flist = new List<SortedList<string, string>>();foreach (SortedList<string, string> sortedList2 in olist){//判断文件夹是否存在bool flag2 = sortedList2["fileType"] == "folder";if (flag2){//存在文件夹,进入递归dlist = this.GetFileList2(spaceId, accessToken, nextToken1, list, unionId, sortedList2["fileId"]);flist.AddRange(dlist);}else{//不存在文件夹,先与表比对DingPanPo dingPanPoByID = this.dingPanRepository.GetDingPanPoByID(sortedList2["fileId"]);bool flag3 = dingPanPoByID == null;if (!flag3){break;}//不存在此文件,加入文件列表flist中flist.Add(new SortedList<string, string>{{"fileId",sortedList2["fileId"]}});}}//查看是否存在nextTokenbool flag4 = nextToken1 == null || nextToken1 == "";if (flag4){result = flist;}else{//进入递归dlist = this.GetFileList2(spaceId, accessToken, nextToken1, flist, unionId, null);result = dlist;}}else{Dictionary<string, string> dictionary2 = new Dictionary<string, string>();dictionary2.Add("unionId", unionId);dictionary2.Add("maxResults", "50");dictionary2.Add("orderType", "createTimeDesc");dictionary2.Add("parentId", parentId);dictionary2.Add("nextToken", nextToken);string url2 = "https://api.dingtalk.com/v1.0/drive/spaces/" + spaceId + "/files";string text3 = HttpHelper.Get(url2, dictionary2, accessToken);SortedList<string, object> sortedList3 = JsonConvert.DeserializeObject<SortedList<string, object>>(text3);JObject jobject2 = JObject.Parse(text3);string text4 = Convert.ToString(sortedList3["nextToken"]);string value2 = jobject2["files"].ToString();List<SortedList<string, string>> list5 = new List<SortedList<string, string>>();list5 = JsonConvert.DeserializeObject<List<SortedList<string, string>>>(value2);List<SortedList<string, string>> list6 = new List<SortedList<string, string>>();List<SortedList<string, string>> list7 = new List<SortedList<string, string>>();foreach (SortedList<string, string> sortedList4 in list5){bool flag5 = sortedList4["fileType"] == "folder";if (flag5){list6 = this.GetFileList2(spaceId, accessToken, text4, list, unionId, sortedList4["fileId"]);}else{DingPanPo dingPanPoByID2 = this.dingPanRepository.GetDingPanPoByID(sortedList4["fileId"]);bool flag6 = dingPanPoByID2 == null;if (!flag6){break;}list7.Add(new SortedList<string, string>{{"fileId",sortedList4["fileId"]}});}}bool flag7 = list == null;if (flag7){list = list7;}else{list.AddRange(list7);}bool flag8 = text4 == null || text4 == "";if (flag8){result = list;}else{List<SortedList<string, string>> list8 = new List<SortedList<string, string>>();list8 = this.GetFileList2(spaceId, accessToken, text4, list, unionId, null);result = list8;}}return result;}

【钉盘日记】通过调用api的方式定时下载钉盘的文件相关推荐

  1. java中调用api的方式(postJsonHTTP)

    //设置格式以及字符编码private static final MediaType JSON = MediaType.parse("application/json; charset=ut ...

  2. python实现api接口的脚本_Zabbix批量添加主机,Python调用api接口方式【脚本定制】...

    使用说明: 此脚本使用方法,详细步骤如下(不清楚的可以加我微信或QQ咨询) 脚本默认添加内容如excel模板所示:主机名.显示名.IP地址.所属组.所属模板1.所属模板2(如需要添加其他内容如: 多个 ...

  3. android pdf下载 打开方式,Android下载并打开pdf文件

    System.out.println("我点击了按钮"); String urlString = "http://public.dhe.ibm.com/common/ss ...

  4. [小白向]Python使用request库调用API并获取返回的JSON数据包中的内容

    目录 对于参数可以直接写入链接中的接口(适用于参数较少时) 对于参数需要使用字典进行携带的接口(适用于请求头中参数较多时) 本文介绍了使用GET的方式调用API的方式,如需要使用POST方式,将代码中 ...

  5. 应用回归分析pdf网盘_艾媒咨询|2020上半年中国个人网盘市场现状及头部企业布局研究报告...

    在遭受2016年的严整打击后,中国个人网盘行业发展回归理性,具备较强资质背景的企业成为市场主要竞争者.另一方面,技术发展和移动终端普及的背景下,更多终端数据.个人文件出现,网民对于存储介质的需求也在提 ...

  6. C/C++中调用api设置mysql连接的编码方式

    MySQL在C/C++中调用api设置连接mysql的编码方式有以下几种方法: 1. mysqli_set_charset 调用示例: [cpp] view plain copy ret = mysq ...

  7. Python调用API接口的几种方式

    本文主要介绍python中调用API的几种方式,下面是python中会用到的库. 1.urllib2 import urllib2, urllib github_url = 'https://api. ...

  8. python中调用API的几种方式

    python中调用API的几种方式: urllib2 httplib2 pycurl requests urllib2 import urllib2, urllib github_url ='http ...

  9. 玩 High API 系列之:实现钉钉Ding功能

    摘要: 钉钉是企业IM市场上的领先者,深受中小企业客户的喜欢,就再几天前刚刚宣布用户数超过1亿!在钉钉里面有个特别实用的功能,那就是Ding一下,如果你发的消息特别紧急,可以直接通过短信.电话等方式直 ...

最新文章

  1. 关于MySQL索引知识与小妙招 — 学到了!
  2. DrugAI | 抗新型冠状病毒药物榜单解析
  3. redis的过期策略和淘汰策略
  4. linux无法挂载移动硬盘6,FC6下挂载NTFS移动硬盘,无法读取
  5. Mysql视图权限设置的踩坑经历
  6. 50个不上你网站的理由
  7. CTO 和你唠唠,这 7 个团队都在干啥 | 神策招人记
  8. 【学习笔记】多项式相关算法
  9. python常用模块用法_python常用模块(一)
  10. swt 键盘事件ctrl+c_VB键盘事件详解
  11. 等待队列中为什么需要互斥锁?一个线程在等待时被唤醒后会做什么?安全队列的代码实现
  12. QWT错误static struct QMetaObject const QwtPlot
  13. ubuntu系统源码下载
  14. js活jQuery实现动态添加、移除css/js文件
  15. matlab晶闸管整流电路,基于Matlab GUI的整流电路仿真
  16. 苹果MAC系统读写NTFS格式u盘硬盘方法
  17. 数据可视化之美:桑基图的前世今生
  18. kaggle之员工离职分析
  19. 计算机组装配置(CPU 后面的字母 有U,H,Y,HQ,M 怎么区别?)
  20. 《安富莱嵌入式周报》第295期:世界杯球员和足球实时跟踪,开源手持矢量网络分析仪,自制柔性电容式传感器,IAR加强对VSCode支持、索尼早期PSX的光驱模拟器

热门文章

  1. 阿克曼小车urdf模型搭建与gazebo仿真
  2. 选择云服务国双科技做甩手大掌柜
  3. 利用Python实现图像的二值化
  4. 集成商调研:中小型集成商的优势与劣势
  5. 图片上传到七牛云存储空间
  6. 实现摄像头在内网、外网、GB28181实现“视频监控/直播”的常用几种方式
  7. 尚硅谷的谷粒学院在线教育项目笔记
  8. mothur reverse.seqs 将序列反向互补
  9. php layer弹出层更改背景,layer更改皮肤的实现方法
  10. c++实验报告——复数类Complex