google drive sdk - files - Migración de la API de Google Drive v3
google drive json api (2)
Decidí migrar de Google Drive API v2 a v3 y no fue una tarea fácil. Aunque Google escribió esta documentation , hay muchas lagunas y no hay mucha información sobre esto en la web.
Estoy compartiendo aquí lo que he encontrado.
No tengo la reputación de comentar (lo siento), pero la línea de código proporcionada en la respuesta aceptada,
service.about().get().setFields("user, storageQuota").execute()
, no se ejecuta , en su lugar, arroja un error de atributo:
about = service.about().get().setFields("user", "storageQuota").execute()
AttributeError: ''HttpRequest'' object has no attribute ''setFields''
En cambio, la línea debería leer:
service.about().get(fields = "user, storageQuota").execute()
Primero, lea los documentos oficiales: documentation
Descargar
Download
ha cambiado.
El campo
downloadUrl
ya no existe.
Ahora, se puede lograr con esto:
service.files().get(fileId).executeMediaAndDownloadTo(outputStream);
webContentLink
el nuevo campo
webContentLink
pero devuelve contenido HTML, en lugar del contenido del archivo.
En otras palabras, le proporciona el enlace a la interfaz de usuario web de Drive.
Subir
Cargar solo requiere cambiar la
insert
palabras para
create
, nada más.
Papelera / Actualización
Perdí algo de tiempo con este 😔.
Solía ser un simple
service.files().trash(fileId).execute()
.
Los doctores dicen
files.trash -> files.update con {''trashed'': true}
El
código de ejemplo
para la
update
en v2 obtiene una entrada en el archivo, establece nuevos valores y luego llama a la
update
.
En v3, el uso de una
update
como esa genera esta excepción:
{
"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."
}
La solución es crear un
File
vacío configurando solo los nuevos valores:
File newContent = new File();
newContent.setTrashed(true);
service.files().update(fileId, newContent).execute();
Nota: El
File
refiere a
com.google.api.services.drive.model.File
(no es
java.io.File
).
Lista
Los archivos devueltos por
service.files().list()
no contienen información ahora, es decir, cada campo es nulo.
Si desea que la
list
en v3 se comporte como en v2, llámela así:
service.files().list().setFields("nextPageToken, files");
Los documentos de
Búsqueda de archivos
usan
setFields("nextPageToken, files(id, name)")
pero no hay documentación sobre cómo obtener toda la información de un archivo.
Ahora ya sabes, solo incluye "archivos".
Campos
Los recursos completos ya no se devuelven de forma predeterminada. Use el parámetro de consulta de
fields
para solicitar que se devuelvan campos específicos. Si se deja sin especificar, solo se devuelve un subconjunto de campos de uso común.
Esa última parte no es totalmente cierta, ya que en algunos casos estás obligado a usar
setFields
.
Por ejemplo, si usa
service.about().get().execute()
obtendrá este error:
"The ''fields'' parameter is required for this method."
que se resuelve llamando a
service.about().get().setFields("user, storageQuota").execute()
, por ejemplo.
Al final de los documentos se menciona como:
El parámetro de consulta de
fields
debe especificarse para los métodos que devuelven
Para el resto de los cambios, solo siga la tabla de Google en los documentos.