您的位置:首页技术文章
文章详情页

java - web端百度网盘的一个操作为什么要分两次请求服务器, 有什么好处吗

浏览:87日期:2022-09-28 14:35:23

问题描述

以 文件重命名 为例:

当完成重命名操作提交会到这个地址 https://pan.baidu.com/api/filemanager

返回如下结果

{ 'errno': 0, 'info': [], 'request_id': 88137407060055336, 'taskid': 307843054247316}

可以联想到在server端建立了一个task, 并返回了taskid让客户端后续取状态来更新ui

客户端轮训服务器的接口 https://pan.baidu.com/share/taskquery 来获取状态, 1秒一次请求, 服务器端返回结果如下: 分几种情况我总结了一下

#进行中的返回值{ 'errno': 0, 'request_id': 88137707954758994, 'task_errno': 0, 'status': 'pending'}#进行中{ 'errno': 0, 'request_id': 88137707954758994, 'task_errno': 0, 'status': 'running'}#操作成功的返回值{ 'errno': 0, 'request_id': 88138584419582326, 'task_errno': 0, 'status': 'success', 'list': [ { 'from': '/test1/我的照片', 'to': '/test1/我的照片2' } ], 'total': 1}

当 status 为success时候, 则轮询结束, 更新UI元素

问题: 直接访问重命名接口不行吗? 为什么要这么设计, 好处是什么?

问题解答

回答1:

你已经说的很清楚了啊,还有什么不明白的?

第一次就是向服务器发起改名申请。服务器就开始任务。后面的轮询都是在查询任务是否完成,完成了前端做相应操作,万一失败了,前端还要做回滚操作。

回答2:

猜一下原因:极端情况下, 操作可能会耗时很久, 无法立即返回. 在操作完成的时候, socket链接可能已经断开, 无法获取到最终的结果. 设计成任务队列的方式, 能保证客户端获取到最终的结果.

回答3:

除了上面的一些考虑,可能还有一个很重要的原因,那就是并发压力。做成异步,能很好解决并发

标签: 百度