Google drive api 如何与Google Drive API同步冲突的更改

Google drive api 如何与Google Drive API同步冲突的更改,google-drive-api,Google Drive Api,我有一个谷歌硬盘应用程序,可以自动保存更改。如果有两个活动会话,则它们将相互覆盖。该应用程序支持合并更改,但我不知道如何安全地将其与驱动器API集成。我考虑过的一些选择: 版本安全提交 使用google drive“仅在驱动器==X中的当前版本失败时更新” 如果失败,则获取最新版本,合并并重试 问题:我认为驱动器不支持此功能。以前的API版本使用ETag,但我在当前的文档中没有提到这一点 预提交检查 检查当前保存的版本,如果仍然是当前版本,则保存 否则下载、合并和更新 问题:客户端之间存在

我有一个谷歌硬盘应用程序,可以自动保存更改。如果有两个活动会话,则它们将相互覆盖。该应用程序支持合并更改,但我不知道如何安全地将其与驱动器API集成。我考虑过的一些选择:

  • 版本安全提交

    • 使用google drive“仅在驱动器==X中的当前版本失败时更新”
    • 如果失败,则获取最新版本,合并并重试

    • 问题:我认为驱动器不支持此功能。以前的API版本使用ETag,但我在当前的文档中没有提到这一点

  • 预提交检查

    • 检查当前保存的版本,如果仍然是当前版本,则保存
    • 否则下载、合并和更新

    • 问题:客户端之间存在明显的竞争状况

  • 提交后检查

    • 保存新版本
    • 如果新版本符合预期:完成
    • 如果新版本高于预期:下载以前的版本,合并并更新

    • 问题:我不太相信这是安全的。我可以看到多个客户端进入编辑循环

  • Google实时api-字段绑定

    • 用google rt数据模型替换文件格式

    • 问题:仅针对谷歌rt就需要重新设计

  • 谷歌实时api-文档支持

    • 使用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。