web-dev-qa-db-fra.com

Migration de l'API Google Drive v3

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é.

16
IvanRF

Commencez par lire la documentation officielle: Migrer vers l'API Google Drive v3


Télécharger

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.


Télécharger

Le téléchargement nécessite seulement de changer le mot insert pour create, rien de plus.


Corbeille/Mise à jour

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).


Liste

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".


Des champs

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.

38
IvanRF

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()
0
Meg