0

Приложение для Android обновляет документ на Google Диске. Файл может быть изменен и в другом месте (например, через веб-интерфейс накопителя), поэтому может возникнуть конфликт при загрузке файла. Однако это редко случается. Вот почему я не хочу, чтобы мое приложение сначала запрашивало историю изменений (поскольку это в большинстве случаев не нужно), и только после этого обновите файл. Как я могу обнаружить, что есть конфликт при обновлении файла?Обнаружение конфликта при загрузке документа на Google Диске

Мои исследования пока показывают, что getHeadRevisionId() returns null, хотя null head revision id has been reported fixed. Еще одна вещь, которую я пробовал, - setEtag() в файле перед обновлением(). It should have given me error on update, но загрузка была успешной, даже файл был удален удаленно! Это правильный способ использования ETag?

ответ

1

Установите If-Match HTTP заголовок:

final Update update = mService.files().update(mDriveFile.getId(), mDriveFile, byteContent); 
final HttpHeaders headers = update.getRequestHeaders(); 
headers.setIfMatch(mDriveFile.getEtag()); 
update.setRequestHeaders(headers); 
mDriveFile = update.execute(); 

В случае документ изменился между тем, обновление получит отвергнут с ответом что-то вроде:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 412 Precondition Failed 
{ 
    "code": 412, 
    "errors": [ 
    { 
     "domain": "global", 
     "location": "If-Match", 
     "locationType": "header", 
     "message": "Precondition Failed", 
     "reason": "conditionNotMet" 
    } 
    ], 
    "message": "Precondition Failed" 
} 

Обратите внимание, что ETag might change even if the content does not.

+0

Как использовать этот подход для v3? Был файл [File.getEtag() в v2] (https://developers.google.com/resources/api-libraries/documentation/drive/v2/java/latest/com/google/api/services/drive/model /File.html#getEtag()), но он [ушел в v3] (https://developers.google.com/resources/api-libraries/documentation/drive/v3/java/latest/). – surlac

1

«Это правильный способ использования ETag?»

Да

Кроме того, для не Docs файлов, вы должны также проверить md5Checksum изменения в содержание.

+0

Итак, если это был правильный способ использования ETag, почему не завершилось обновление моего файла? –

+0

Можете ли вы вставить HTTP-запрос и ответ. – pinoyyid

+0

Мое подозрение в том, что setEtag() не устанавливает заголовок If-Match. Вам, вероятно, придется установить его вручную. Увидеть запрос http должен подтвердить это. – pinoyyid

Смежные вопросы