J'ai décidé de migrer de Google Drive API v2 vers v3 et ce n'était pas une tâche facile. Même si Google a écrit cette documentation , il y a beaucoup de lacunes et peu d’informations à ce sujet sur le Web.
Je partage ici ce que j'ai trouvé.
Commencez par lire la documentation officielle: Migrer vers l'API Google Drive v3
Télécharger a changé. Le champ downloadUrl
n'existe plus. Maintenant, cela peut être réalisé avec ceci:
service.files().get(fileId).executeMediaAndDownloadTo(outputStream);
J'ai essayé le nouveau champ webContentLink
mais il renvoie le contenu HTML au lieu du contenu du fichier. En d'autres termes, il vous donne le lien vers l'interface utilisateur Web de Drive.
Le téléchargement nécessite seulement de changer le mot insert
pour create
, rien de plus.
J'ai perdu du temps avec celui-ci ???? Autrefois, c'était une simple service.files().trash(fileId).execute()
. Docs dit
files.trash -> files.update avec {'trashed': true}
Le exemple de code pour update
sur v2 crée une get
sur le fichier, définit de nouvelles valeurs, puis appelle update
.
Sur v3, utiliser update
comme cela lève cette exception:
{
"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 solution consiste à créer un File
vide contenant uniquement les nouvelles valeurs:
File newContent = new File();
newContent.setTrashed(true);
service.files().update(fileId, newContent).execute();
Remarque: File
fait référence à com.google.api.services.drive.model.File
(ce n'est pas Java.io.File
).
Les fichiers renvoyés par service.files().list()
ne contiennent pas d’informations à présent, c’est-à-dire que tous les champs sont nuls. Si vous voulez que list
sur la v3 se comporte comme dans la v2, appelez-le comme ceci:
service.files().list().setFields("nextPageToken, files");
La documentation sur Rechercher des fichiers utilise setFields("nextPageToken, files(id, name)")
, mais il n’existe aucune documentation permettant d’obtenir toutes les informations sur un fichier. Maintenant, vous savez, il suffit d'inclure "fichiers".
Les ressources complètes ne sont plus renvoyées par défaut. Utilisez le paramètre de requête
fields
pour demander le renvoi de champs spécifiques. S'il n'est pas spécifié, seul un sous-ensemble des champs couramment utilisés est renvoyé.
Cette dernière partie n'est pas totalement vraie, car vous êtes obligé d'utiliser setFields
dans certains cas. Par exemple, si vous utilisez service.about().get().execute()
, vous obtiendrez cette erreur:
"The 'fields' parameter is required for this method."
qui est résolu en appelant service.about().get().setFields("user, storageQuota").execute()
, par exemple.
À la fin de la documentation est mentionné comme:
Le paramètre de requête
fields
doit être spécifié pour les méthodes qui renvoient
Pour le reste des modifications, suivez simplement le tableau Google sur la documentation.
Je n'ai pas la réputation de commenter (désolé), mais la ligne de code fournie dans la réponse acceptée, service.about().get().setFields("user, storageQuota").execute()
, ne s'exécute pas, mais génère une erreur d'attribut:
about = service.about().get().setFields("user", "storageQuota").execute()
AttributeError: 'HttpRequest' object has no attribute 'setFields'
Au lieu de cela, la ligne devrait se lire:
service.about().get(fields = "user, storageQuota").execute()