2014-11-04 74 views
2

我有一個可以自動保存更改的谷歌驅動器應用程序。如果你有兩個活動會話,那麼他們會覆蓋對方。該應用程序支持合併更改,但我無法看到如何安全地將其與驅動器API集成。有些選項我已考慮:如何使用Google Drive API同步衝突的更改

  1. 版安全承諾

    • 使用谷歌驅動器「僅更新,如果在驅動電流修訂== X否則失敗」
    • 如果失敗則獲取最新版本,合併並重試

    • 問題:我不認爲驅動器支持這一點。以前的API版本使用了etags,但在當前的文檔中我沒有看到這一點。

  2. 提交前的檢查

    • 檢查當前保存的版本,如果仍然電流,節省
    • 否則下載,合併和更新

    • 問題:明顯的競爭條件客戶之間

  3. 提交後檢查

    • 保存新版本
    • 如果如預期的新版本:完成
    • 如果新版本高於預期:下載以前的版本,合併和更新

    • 問題:我沒有太多的信心,這是安全的。我可以看到多個客戶端進入編輯循環。

  4. 谷歌的實時API - 場結合

    • 與谷歌RT數據模型替換文件格式

    • 問題:這需要只是谷歌-RT

      重新設計
  5. 谷歌的實時API - 文檔支持

    • 使用谷歌API的RT外部文檔支持

    • 問題:我不認爲這解決了問題

我真的很想獲得#1的方法,但任何建議都會有所幫助。我很滿意客戶端之間的基本鎖定/切換方案,但我認爲Drive也不支持這種方案。

+0

什麼是你改變文件,即MIME類型。它是一種本地谷歌類型,如文檔或電子表格,還是它自己的文件類型,如HTML或專有? – pinoyyid 2014-11-04 09:28:34

+0

它是一種專有格式 - 目前用json編碼,但可能變成二進制。 – daw 2014-11-05 07:08:30

回答

1

根據here,使用etags的「If-Match」仍然有效。不確定它是否適用於數據,但至少它適用於元數據。

+0

不幸的是,不再使用API​​的v3。 – 2018-02-28 22:30:11

0

要在user1828559的回答跟進,下面的Java代碼似乎運作良好:

private File updateDriveFile(Drive drive, File file, byte[] data) throws IOException { 
    try { 
     ByteArrayContent mediaContent = new ByteArrayContent(MIME_TYPE, data); 
     Drive.Files.Update update = drive.files().update(file.getId(), file, mediaContent); 

     update.getRequestHeaders().setIfMatch(file.getEtag()); 

     return update.execute(); 
    } 
    catch (GoogleJsonResponseException e) { 
     if (isConflictError(e.getDetails())) { 
      logger.warn("ETag precondition failed, concurrent modification detected!"); 
      return null; 
     } 

     throw e; 
    } 
} 

private boolean isConflictError(GoogleJsonError error) { 
    if (error.getCode() == 412) { 
     final List<GoogleJsonError.ErrorInfo> errors = 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())) 
       return true; 
     } 
    } 

    return false; 
} 
相關問題