Google drive api 如何与Google Drive API同步冲突的更改
我有一个谷歌硬盘应用程序,可以自动保存更改。如果有两个活动会话,则它们将相互覆盖。该应用程序支持合并更改,但我不知道如何安全地将其与驱动器API集成。我考虑过的一些选择:Google drive api 如何与Google Drive API同步冲突的更改,google-drive-api,Google Drive Api,我有一个谷歌硬盘应用程序,可以自动保存更改。如果有两个活动会话,则它们将相互覆盖。该应用程序支持合并更改,但我不知道如何安全地将其与驱动器API集成。我考虑过的一些选择: 版本安全提交 使用google drive“仅在驱动器==X中的当前版本失败时更新” 如果失败,则获取最新版本,合并并重试 问题:我认为驱动器不支持此功能。以前的API版本使用ETag,但我在当前的文档中没有提到这一点 预提交检查 检查当前保存的版本,如果仍然是当前版本,则保存 否则下载、合并和更新 问题:客户端之间存在
- 使用google drive“仅在驱动器==X中的当前版本失败时更新”
- 如果失败,则获取最新版本,合并并重试
- 问题:我认为驱动器不支持此功能。以前的API版本使用ETag,但我在当前的文档中没有提到这一点
- 检查当前保存的版本,如果仍然是当前版本,则保存
- 否则下载、合并和更新
- 问题:客户端之间存在明显的竞争状况
- 保存新版本
- 如果新版本符合预期:完成
- 如果新版本高于预期:下载以前的版本,合并并更新
- 问题:我不太相信这是安全的。我可以看到多个客户端进入编辑循环
- 用google rt数据模型替换文件格式
- 问题:仅针对谷歌rt就需要重新设计
- 使用google rt api外部文档支持
- 问题:我认为这不能解决问题
我真的很想找到一个实现1的方法,但任何建议都会有所帮助。我很乐意在客户端之间使用基本的锁定/切换方案,但我认为Drive也不支持这种方案。根据使用ETag的“如果匹配”仍然有效。不确定它是否适用于数据,但至少它适用于元数据。为了跟进user1828559的答案,以下Java代码似乎运行良好:
private File updateDriveFile(驱动器、文件文件、字节[]数据)引发IOException{
试一试{
ByteArrayContent mediaContent=新的ByteArrayContent(MIME_类型,数据);
Drive.Files.Update Update=Drive.Files().Update(file.getId(),file,mediaContent);
update.getRequestHeaders().setIfMatch(文件.getEtag());
返回update.execute();
}
捕获(GoogleJsonResponseException e){
if(isConflicertRor(e.getDetails())){
logger.warn(“ETag前置条件失败,检测到并发修改!”);
返回null;
}
投掷e;
}
}
私有布尔值isConflictError(GoogleJsonError错误){
if(error.getCode()==412){
最终列表错误=error.getErrors();
if(errors!=null&&errors.size()=1){
final GoogleJsonError.ErrorInfo ErrorInfo=errors.get(0);
if(“header”.equals(errorInfo.getLocationType())&&
“If Match”.equals(errorInfo.getLocation())&&
“conditionNotMet”.equals(errorInfo.getReason()))
返回true;
}
}
返回false;
}
您正在更改的文件的mime类型是什么,即它是本地google类型(如文档或电子表格),还是您自己的文件类型(如html或专有格式)?它是专有格式-当前以json编码,但可能会变成二进制。不幸的是,不再使用API的v3。