最近在整一个定时将钉钉云盘所有文件下载下来的服务,其中因为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. 李航「机器学习」最全综述
  2. 深度学习融入博弈论的方法会迸发出哪些新思路呢?
  3. SAP MM 物料主数据MRP2 视图Rounding Value字段
  4. Lua 代码编写技巧
  5. 链表经典题:K个一组翻转链表
  6. 在数据准备区中允许使用的数据结构有哪些, 各有什么优点?
  7. 推荐优秀的SQL脚本调试工具Embarcadero DBArtisan 可以调试SQL Server 2000/2005 SQL调试工具汇总...
  8. vs不一致的行尾对话框怎么调出_细分调漆步骤,新手师傅怎么轻松调漆
  9. 入门机器学习(二十)--编程作业-异常检测和推荐系统(Python实现)
  10. HTML不刷新,改数据
  11. 电话机器人源码安装教程
  12. RH850中断使用方法
  13. 从0教你用Python写网络爬虫,内容详细代码清晰,适合入门学习
  14. 实用工具系列 - Pycharm安装下载使用
  15. JavaScript核心之Document对象概述(document的属性,方法,事件)
  16. 键盘没有小键盘怎么办?怎么打开屏幕软键盘?
  17. 放假倒计时弹幕单页网站源码
  18. 一测振系统包括微型计算机,激振器之振动测试系统组成及基本仪器的使用方法 ......
  19. 结构方程模型(SEM)及其R实现
  20. java lombok.getter_Java如何使用Lombok生成getter和setter?

热门文章

  1. 基于SparkSql的日志分析实战
  2. 水桶服务器eula文件,minecraft1.8开服问题.doc
  3. 3D模型欣赏:2000宝马E46瓦罐 光影材质逼真,还以为是真的一样!
  4. Python入门自学进阶-Web框架——16、Django登录/注册
  5. Fluke Corporation收购工业可靠性领导者普卢福
  6. VLAN和trunking技术笔记整理
  7. 手游跑跑卡丁车服务器维护,跑跑卡丁车手游登陆不了怎么办_跑跑卡丁车手游登陆不了解决方法_游戏吧...
  8. 百度搜索URL参数 搜索关键字
  9. 电大计算机应用基础课程形成考核,2016年电大-电大计算机应用基础形成性考核.doc...
  10. FPGA新起点V1开发板(二)——Quartus II软件的安装和USB-BLaster驱动安装