Миграция Google Диска API v3

Я решил перейти с Google Drive API версии v2 на v3, и это была непростая задача. Даже подумал, что Google написал эту документацию, в ней много пробелов, и в Интернете мало информации об этом.

Я делюсь тем, что нашел.

Ответы

Ответ 1

Сначала прочитайте официальные документы: Перейдите на Google Drive API v3


Скачать

Download изменилось. Поле downloadUrl больше не существует. Теперь это может быть достигнуто с помощью этого:

service.files().get(fileId).executeMediaAndDownloadTo(outputStream);

Я попробовал новое поле webContentLink, но он возвращает содержимое HTML, а не содержимое файла. Другими словами, он дает вам ссылку на веб-интерфейс веб-диска.


Загрузить

Загрузка только требует изменить слово insert для create, не более того.


Корзина/Обновление

Я потратил некоторое время на это. Используется для простого service.files().trash(fileId).execute(). Документы говорят

files.trash → files.update с {'trashed': true}

Пример кода для update на v2 делает файл get в файле, устанавливает новые значения и затем вызывает update.

В v3, используя update, как это делает это исключение:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "The resource body includes fields which are not directly writable.",
    "reason" : "fieldNotWritable"
  } ],
  "message" : "The resource body includes fields which are not directly writable."
}

Решение состоит в том, чтобы создать пустой File параметр только для новых значений:

File newContent = new File();
newContent.setTrashed(true);
service.files().update(fileId, newContent).execute();

Примечание: File относится к com.google.api.services.drive.model.File (это не java.io.File).


List

Файлы, возвращаемые service.files().list(), теперь не содержат информации, т.е. каждое поле имеет значение NULL. Если вы хотите, чтобы list на v3 вел себя как в v2, назовите его следующим образом:

service.files().list().setFields("nextPageToken, files");

Документы Поиск файлов используют setFields("nextPageToken, files(id, name)"), но нет документации о том, как получить всю информацию для файла. Теперь вы знаете, просто включите "файлы".


Поля

Полные ресурсы больше не возвращаются по умолчанию. Используйте параметр запроса fields для запроса определенных полей, которые будут возвращены. Если значение не указано, возвращается только подмножество обычно используемых полей.

Эта последняя часть не совсем верна, поскольку в некоторых случаях вы вынуждены использовать setFields. Например, если вы используете service.about().get().execute(), вы получите эту ошибку:

"The 'fields' parameter is required for this method."

который решается путем вызова service.about().get().setFields("user, storageQuota").execute(), например.

В конце документа указывается как:

Параметр запроса fields должен быть указан для методов, возвращающих


Для остальных изменений просто следуйте таблице Google в документах.

Ответ 2

У меня нет репутации комментировать (извините), но предоставленная строка кода в принятом ответе, service.about().get().setFields("user, storageQuota").execute(), не запускается. вместо этого он выдает ошибку атрибута:

    about = service.about().get().setFields("user", "storageQuota").execute()
AttributeError: 'HttpRequest' object has no attribute 'setFields'

Вместо этого строка должна выглядеть так:

service.about().get(fields = "user, storageQuota").execute()