Обнаружить конфликт при загрузке документа на Google Диск

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

Мое расследование показывает, что getHeadRevisionId() возвращает значение null, хотя сообщается, что нулевой идентификатор версии заголовка исправлен. Еще одна вещь, которую я попробовал, была setEtag() для файла перед update(). Это должно было привести к ошибке при обновлении, но загрузка прошла успешно, даже если файл был изменен удаленно! Это правильный способ использовать ETag?

2 ответа

Решение

Установить 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 может измениться, даже если содержание не меняется.

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

да

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

Другие вопросы по тегам