Migración de Google Drive API v3

Decidí migrar de Google Drive API v2 a v3 y no fue una tarea fácil. Aun cuando Google escribió esta documentación , hay muchos vacíos y no hay mucha información sobre esto en la web.

Estoy compartiendo aquí lo que he encontrado.

Primero, lea los documentos oficiales: Migrar a Google Drive API v3


Descargar

La descarga 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 da el enlace a la interfaz de usuario web de Drive.


Subir

La carga solo requiere cambiar la palabra insert para create , nada más.


Basura / 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 hace un get en el archivo, establece nuevos valores y luego llama a la update .

En la v3, al usar una update como esa arroja 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 una configuración de File vacía 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 en la búsqueda de archivos usan setFields("nextPageToken, files(id, name)") pero no hay documentación sobre cómo obtener toda la información para un archivo. Ahora ya sabes, solo incluye “archivos”.


Campos

Los recursos completos ya no se devuelven por defecto. Use el parámetro de consulta de fields para solicitar que se devuelvan campos específicos. Si no se especifica, solo se devuelve un subconjunto de campos de uso común.

Esa última parte no es totalmente cierta, ya que se ve obligado a usar setFields en algunos casos. 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 rest de los cambios, solo sigue la tabla de Google en los documentos.