Documentation de référence sur le protocole

Avertissement : Cette page concerne les anciennes API Google, les API Google Data. Elle ne concerne que les API répertoriées dans l'annuaire des API Google Data, dont la plupart ont été remplacées par de nouvelles API. Pour en savoir plus sur une nouvelle API spécifique, consultez sa documentation. Pour en savoir plus sur l'autorisation des requêtes avec une API plus récente, consultez Authentification et autorisation des comptes Google.

Ce document décrit le protocole de données Google utilisé par de nombreuses API Google, y compris des informations sur une requête, sur les résultats, etc.

Pour en savoir plus sur le protocole de données Google, consultez la page de présentation du Guide du développeur et le document Principes de base du protocole.

Audience

Ce document est destiné à toute personne souhaitant comprendre les détails du format XML et du protocole utilisés par les API qui implémentent le protocole de données Google.

Si vous souhaitez simplement écrire du code qui utilise l'une de ces API, vous n'avez pas besoin de connaître ces informations détaillées. Vous pouvez utiliser les bibliothèques clientes spécifiques à chaque langage.

Toutefois, si vous souhaitez comprendre le protocole, lisez ce document. Par exemple, vous pouvez consulter ce document pour vous aider à effectuer les tâches suivantes:

  • évaluer l'architecture du protocole de données Google
  • coder à l'aide du protocole sans utiliser les bibliothèques clientes fournies
  • Écrire une bibliothèque cliente dans un nouveau langage

Dans ce document, nous partons du principe que vous comprenez les principes de base du XML, les espaces de noms, les flux syndiqués, les requêtes GET, POST, PUT et DELETE en HTTP, ainsi que le concept de "ressource" de HTTP. Pour en savoir plus, consultez la section Autres ressources de ce document.

Ce document ne repose sur aucun langage de programmation particulier. Vous pouvez envoyer et recevoir des messages via le protocole de données Google à l'aide de n'importe quel langage de programmation qui vous permet d'émettre des requêtes HTTP et d'analyser les réponses XML.

Détails du protocole

Cette section décrit le format des documents du protocole de données Google et la syntaxe des requêtes.

Format du document

Le protocole de données Google et Atom partagent le même modèle de données de base: un conteneur qui contient à la fois des données globales et un nombre illimité d'entrées. Pour chaque protocole, le format est défini par un schéma de base, mais il peut être étendu à l'aide d'espaces de noms étrangers.

Atom est le format par défaut du protocole de données Google. Pour demander une réponse dans un autre format, utilisez le paramètre de requête alt. Pour en savoir plus, consultez la section Requêtes de requête.

Remarque: La plupart des flux de données Google au format Atom utilisent l'espace de noms Atom comme espace de noms par défaut en spécifiant un attribut xmlns sur l'élément du flux, comme indiqué dans les exemples de protocoles de base. Ainsi, les exemples de ce document ne spécifient pas explicitement atom: pour des éléments d'un flux au format Atom.

Les tableaux suivants illustrent la représentation Atom des éléments du schéma. Toutes les données non mentionnées dans ces tableaux sont traitées comme des fichiers XML ordinaires. Sauf indication contraire, les éléments XML d'une colonne donnée se trouvent dans l'espace de noms Atom.

Remarque : Ce résumé utilise la notation XPath standard. Plus précisément, les barres obliques indiquent la hiérarchie des éléments, et le signe @ indique l'attribut d'un élément.

Dans chacun des tableaux suivants, les éléments en surbrillance sont obligatoires.

Le tableau suivant présente les éléments d'un flux de protocole de données Google:

Élément de schéma de flux Représentation Atom
Titre du flux /feed/title
ID du flux /feed/id
Lien HTML du flux /feed/link[@rel="alternate"] \
[@type="text/html"]/@href
Description du flux /feed/subtitle
Langue du flux /feed/@xml:lang
Droits d'auteur du flux /feed/rights
Auteur du flux

/feed/author/name
/feed/author/email

(Obligatoire dans certains cas ; voir la spécification Atom).

Date de la dernière mise à jour du flux /feed/updated
(format RFC 3339)
Catégorie de flux /feed/category/@term
Schéma de catégorie de flux /feed/category/@scheme
Générateur de flux /feed/generator
/feed/generator/@uri
Icône du flux /feed/icon
Logo du flux /feed/logo

Le tableau suivant présente les éléments d'un flux de résultats de recherche du protocole Google Data. Notez que le protocole expose certains des éléments OpenSearch 1.1 Response dans les flux de résultats de recherche.

Élément de schéma du flux de résultats de recherche Représentation Atom
Nombre de résultats de recherche /feed/openSearch:totalResults
Indice de départ des résultats de recherche /feed/openSearch:startIndex
Nombre de résultats de recherche par page /feed/openSearch:itemsPerPage

Le tableau suivant présente les éléments d'une entrée du protocole de données Google:

Élément du schéma d'entrée Représentation Atom
ID d'entrée /feed/entry/id
Titre de l'entrée /feed/entry/title
Lien d'entrée /feed/entry/link
Résumé de l'entrée

/feed/entry/summary

(Obligatoire dans certains cas ; voir la spécification Atom).

Contenu de l'entrée

/feed/entry/content

Si aucun élément de contenu, l'entrée doit contenir au moins un élément <link rel="alternate">.

Auteur de l'entrée

/feed/entry/author/name
/feed/entry/author/email

(Obligatoire dans certains cas ; voir la spécification Atom).

Catégorie d'entrée /feed/entry/category/@term
Schéma de catégorie d'entrée /feed/entry/category/@scheme
Date de publication de l'entrée /feed/entry/published
(RFC 3339)
Date de mise à jour de l'entrée /feed/entry/updated
(RFC 3339)

Queries

Cette section explique comment utiliser le système de requête.

Principes de conception des modèles de requête

Le modèle de requête est intentionnellement très simple. Les principes de base sont les suivants:

  • Les requêtes sont exprimées sous forme d'URI HTTP, et non plus comme des en-têtes HTTP ou dans la charge utile. L'un des avantages de cette approche est que vous pouvez créer un lien vers une requête.
  • Les prédicats sont limités à un seul élément. Il n'existe donc aucun moyen d'envoyer une requête de corrélation, telle que "trouver tous les e-mails des personnes qui m'ont envoyé au moins 10 e-mails aujourd'hui".
  • L'ensemble de propriétés sur lesquelles les requêtes peuvent effectuer des prédicats est très limité. La plupart des requêtes sont simplement des requêtes de recherche en texte intégral.
  • L'ordre des résultats dépend de la mise en œuvre.
  • Le protocole est naturellement extensible. Si vous souhaitez exposer d'autres prédicats ou trier votre service, vous pouvez facilement le faire en introduisant de nouveaux paramètres.

Requêtes de requête

Un client interroge un service Google en envoyant une requête HTTP GET. L'URI de la requête comprend l'URI de la ressource (FeedURI dans Atom) suivi des paramètres de requête. La plupart des paramètres de requête sont représentés par des paramètres d'URL ?name=value[&...] traditionnels. Les paramètres de catégorie sont gérés différemment (voir ci-dessous).

Par exemple, si l'URI est http://www.example.com/feeds/jo, vous pouvez envoyer une requête avec l'URI suivant:

http://www.example.com/feeds/jo?q=Darcy&updated-min=2005-04-19T15:30:00Z

Le protocole de données Google est compatible avec le protocole GET conditionnel HTTP. Les API qui implémentent le protocole définissent l'en-tête de réponse "Last-Modified" en fonction de la valeur de l'élément <atom:updated> dans l'entrée ou le flux renvoyé. Un client peut renvoyer cette valeur comme valeur de l'en-tête de requête If-Modified-Since pour éviter de récupérer à nouveau le contenu s'il n'a pas été modifié. Si le contenu n'a pas changé depuis l'heure If-Modified-Since, le service renvoie une réponse HTTP 304 (Non modifié).

Les API qui implémentent le protocole de données Google doivent accepter les requêtes alt. La compatibilité avec d'autres paramètres est facultative. La transmission d'un paramètre standard non compris par un service donné génère une réponse 403 Forbidden. La transmission d'un paramètre non standard non compatible entraîne une réponse 400 Bad Request. Pour en savoir plus sur les autres codes d'état, consultez la section Codes d'état HTTP de ce document.

Les paramètres de requête standards sont résumés dans le tableau suivant. Toutes les valeurs des paramètres doivent être encodées au format URL.

Paramètre Signification Remarques
alt Autre type de représentation
  • Si vous ne spécifiez pas de paramètre alt, le service renvoie un flux Atom. Cela équivaut à alt=atom.
  • alt=rss renvoie un flux de résultats RSS 2.0 (en lecture seule). Lorsque vous demandez des données à un service au format RSS, celui-ci fournit un flux (ou une autre représentation de la ressource) au format RSS. S'il n'existe pas de propriété RSS équivalente pour une propriété API Data donnée, le service utilise la propriété Atom et lui associe un espace de noms approprié pour indiquer qu'il s'agit d'une extension de RSS.
  • alt=json renvoie une représentation JSON du flux. En savoir plus
  • alt=json-in-script Demande une réponse qui encapsule JSON dans un tag de script. En savoir plus
  • alt=atom-in-script Demande une réponse Atom qui encapsule une chaîne XML dans un tag de script.
  • alt=rss-in-script Demande une réponse RSS qui encapsule une chaîne XML dans un tag de script.
  • alt=atom-service Demande un document de service Atom décrivant le flux.
author Auteur de l'entrée
  • Le service renvoie des entrées dont le nom et/ou l'adresse e-mail correspondent à votre chaîne de requête.
category Filtre de requête de catégorie
  • Autre méthode pour filtrer les catégories. Les deux méthodes sont équivalentes.
  • Pour séparer les termes par OR, utilisez une barre verticale (|), encodée au format URL sous la forme %7C. Par exemple, http://www.example.com/feeds?category=Fritz%7CLaurie renvoie les entrées correspondant à l'une des catégories.
  • Pour effectuer une opération AND entre les termes, utilisez une virgule (,). Par exemple: http://www.example.com/feeds?category=Fritz,Laurie renvoie les entrées correspondant aux deux catégories.
/-/category Filtre de requête de catégorie
  • Répertoriez chaque catégorie comme si elle faisait partie de l'URI de la ressource, au format /categoryname/. Il s'agit d'une exception au formulaire name=value habituel.
  • Répertoriez toutes les catégories avant tout autre paramètre de requête.
  • Faites précéder la première catégorie par /-/ pour indiquer clairement qu'il s'agit d'une catégorie. Par exemple, si le flux de Jean dispose d'une catégorie pour les entrées concernant Fritz, vous pouvez demander les entrées suivantes: http://www.example.com/feeds/jo/-/Fritz. Cela permet à l'implémentation de distinguer les URI de requêtes prédéterminés par catégorie des URI de ressources.
  • Vous pouvez interroger plusieurs catégories en répertoriant plusieurs paramètres de catégorie, séparés par des barres obliques. Le service renvoie toutes les entrées correspondant à toutes les catégories (par exemple, AND entre des termes). Par exemple, http://www.example.com/feeds/jo/-/Fritz/Laurie renvoie les entrées correspondant aux deux catégories.
  • Pour séparer les termes par OR, utilisez une barre verticale (|) encodée au format URL sous la forme %7C. Par exemple, http://www.example.com/feeds/jo/-/Fritz%7CLaurie renvoie les entrées correspondant à l'une des catégories.
  • Une entrée correspond à une catégorie spécifiée si elle est associée à un terme ou à un libellé correspondant, tel que défini dans la spécification Atom. En gros, le "terme" est la chaîne interne utilisée par le logiciel pour identifier la catégorie, tandis que le "libellé" est la chaîne lisible présentée à un utilisateur dans une interface utilisateur.
  • Pour exclure des entrées correspondant à une catégorie donnée, utilisez le formulaire /-categoryname/.
  • Pour rechercher une catégorie comportant un schéma (<category scheme="urn:google.com" term="public"/>, par exemple), vous devez le placer entre accolades avant le nom de la catégorie. Exemple : /{urn:google.com}public. Si le schéma contient une barre oblique (/), il doit être encodé en URL comme %2F. Pour faire correspondre une catégorie sans schéma, utilisez une paire d'accolades vide. Si vous ne spécifiez pas d'accolades, les catégories de n'importe quel schéma vont correspondre.
  • Les fonctionnalités ci-dessus peuvent être combinées. Par exemple, /A%7C-{urn:google.com}B/-C signifie (A OR (NOT B)) AND (NOT C).
ID d'entrée ID d'une entrée spécifique à récupérer
  • Si vous spécifiez un ID d'entrée, vous ne pouvez pas spécifier d'autres paramètres.
  • La forme de l'ID d'entrée est déterminée par le service.
  • Contrairement à la plupart des autres paramètres de requête, l'ID d'entrée est spécifié dans l'URI, et non pas dans une paire nom=valeur.
  • Exemple : http://www.example.com/feeds/jo/entry1
fields Filtre de réponse
  • Renvoie seulement les champs demandés, plutôt que la représentation complète de la ressource. Exemple :
    http://www.example.com/feeds?fields=link,entry(@gd:etag,id,updated,link[@rel='edit']))
    Lorsqu'il reçoit cette requête, le serveur renvoie une réponse qui ne contient que des éléments link et entry pour le flux. En outre, les éléments d'entrée affichés sont des entrées partielles qui ne contiennent que l'ETag, l'ID, la mise à jour et la modification des relations entre les liens.
  • La valeur des champs doit être encodée au format URL, comme pour toutes les valeurs des paramètres de requête.
  • Pour en savoir plus, consultez la section Réponse partielle.
  • Ce paramètre est actuellement une fonctionnalité expérimentale.
max-results Nombre maximal de résultats à récupérer Pour tout service associé à une valeur max-results par défaut (pour limiter la taille de flux par défaut), vous pouvez indiquer un nombre très élevé si vous souhaitez recevoir l'intégralité du flux.
prettyprint Renvoie une réponse XML avec des identifiants et des sauts de ligne
  • Si la valeur est prettyprint=true, le fichier XML renvoyé par le serveur sera lisible (mis en forme).
  • Valeur par défaut : prettyprint=false
published-min, published-max Limites à la date de publication de l'entrée
  • Utilisez le format d'horodatage RFC 3339. Exemple : 2005-08-09T10:57:00-08:00.
  • La limite inférieure est inclusive, alors que la limite supérieure est exclusive.
q Chaîne de requête en texte intégral
  • Lorsque vous créez une requête, répertoriez les termes de recherche en les séparant par des espaces, sous la forme q=term1 term2 term3. (Comme pour toutes les valeurs des paramètres de requête, les espaces doivent être encodés en URL.) Le service renvoie toutes les entrées correspondant à tous les termes de recherche (par exemple, utilisation de AND entre les termes). À l'instar de la recherche sur le Web Google, un service de recherche s'appuie sur des mots complets (et sur des termes similaires ayant la même racine), et non des sous-chaînes.
  • Pour rechercher une expression exacte, placez-la entre guillemets: q="exact phrase".
  • Pour exclure des entrées correspondant à un terme donné, utilisez le formulaire q=-term.
  • La recherche n'est pas sensible à la casse.
  • Exemple: pour rechercher toutes les entrées contenant l'expression exacte "Elizabeth Bennet" et le mot "Darcy", mais pas le mot "Austen", utilisez la requête suivante: ?q="Elizabeth Bennet" Darcy -Austen
start-index Index de base 1 du premier résultat à récupérer
  • Notez qu'il ne s'agit pas d'un mécanisme de curseur général. Si vous envoyez d'abord une requête avec ?start-index=1&max-results=10, puis que vous en envoyez une autre avec ?start-index=11&max-results=10, le service ne peut pas garantir que les résultats seront équivalents à ?start-index=1&max-results=20, car des insertions et des suppressions peuvent avoir eu lieu entre les deux requêtes.
strict Vérification stricte des paramètres de requête
  • Définissez strict=true pour vérifier que chacun de vos paramètres de requête est reconnu par le service. Une erreur est renvoyée si un paramètre n'est pas reconnu.
  • Valeur par défaut : strict=false
updated-min, updated-max Limites à la date de mise à jour de l'entrée
  • Utilisez le format d'horodatage RFC 3339. Exemple : 2005-08-09T10:57:00-08:00.
  • La limite inférieure est inclusive, alors que la limite supérieure est exclusive.
  • Dans certains cas, par exemple lorsque vous utilisez la version 2.1 ou une version ultérieure de l'API Calendar Data, le fait de spécifier une valeur updated-min trop éloignée dans le passé entraîne le renvoi d'un état HTTP 410 (Déplacé).

À propos des requêtes par catégorie

Nous avons décidé de proposer un format légèrement inhabituel pour les requêtes par catégorie. Au lieu d'exiger une requête de ce type:

http://example.com/jo?category=Fritz&category=2006

nous avons rendu possible l'utilisation:

http://example.com/jo/-/Fritz/2006

Cette approche identifie une ressource sans utiliser de paramètres de requête et génère des URI plus propres. Nous avons choisi cette approche pour les catégories, car nous pensons que les requêtes par catégorie seront parmi les plus courantes.

L'inconvénient de cette approche est que nous vous demandons d'utiliser /-/ dans ce type de requêtes de catégorie, afin que les services puissent distinguer les requêtes de catégorie des autres URI de ressources, tels que http://example.com/jo/MyPost/comments.

Réponses aux requêtes

Les requêtes renvoient un flux Atom, une entrée Atom ou un flux RSS, en fonction des paramètres de requête.

Les résultats de requête contiennent les éléments OpenSearch suivants directement sous l'élément <feed> ou l'élément <channel> (selon que les résultats sont Atom ou RSS):

openSearch:totalResults
Nombre total de résultats de recherche pour la requête (pas nécessairement présents dans le flux de résultats).
openSearch:startIndex
Index en base 1 du premier résultat.
openSearch:itemsPerPage
Nombre maximal d'éléments pouvant apparaître sur une page. Cela permet aux clients de générer des liens directs vers n'importe quel ensemble de pages suivantes. Toutefois, si vous pensez qu'il existe un problème avec ce nombre, consultez la remarque concernant start-index dans le tableau de la section Requêtes de requête.

Le flux et les entrées de réponse Atom peuvent également inclure l'un des éléments d'API Atom and Data suivants (ainsi que d'autres éléments listés dans la spécification Atom):

<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="..."/>
Spécifie l'URI vers lequel le flux Atom complet peut être récupéré.
<link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="..."/>
Indique l'URI (PostURI) du flux Atom (où les nouvelles entrées peuvent être publiées).
<link rel="self" type="..." href="..."/>
Contient l'URI de cette ressource. La valeur de l'attribut type dépend du format demandé. Si aucune donnée n'est modifiée entre temps, l'envoi d'un autre GET à cet URI renvoie la même réponse.
<link rel="previous" type="application/atom+xml" href="..."/>
Spécifie l'URI du fragment précédent de cet ensemble de résultats de requête, s'il est fragmenté.
<link rel="next" type="application/atom+xml" href="..."/>
Spécifie l'URI du prochain fragment de cet ensemble de résultats de requête, s'il est fragmenté.
<link rel="edit" type="application/atom+xml" href="..."/>
Indique l'URI de l'entrée Atom (dans laquelle vous envoyez une entrée mise à jour).

Voici un exemple de corps de réponse à une requête de recherche:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
        xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/"
        xmlns:gd='http://schemas.google.com/g/2005'
        gd:etag='W/"C0QBRXcycSp7ImA9WxRVFUk."'>
  <id>http://www.example.com/feed/1234.1/posts/full</id>
  <updated>2005-09-16T00:42:06Z</updated>
  <title type="text">Books and Romance with Jo and Liz</title>
  <link rel="alternate" type="text/html" href="http://www.example.net/"/>
  <link rel="http://schemas.google.com/g/2005#feed"
    type="application/atom+xml"
    href="http://www.example.com/feed/1234.1/posts/full"/>
  <link rel="http://schemas.google.com/g/2005#post"
    type="application/atom+xml"
    href="http://www.example.com/feed/1234.1/posts/full"/>
  <link rel="self" type="application/atom+xml"
    href="http://www.example.com/feed/1234.1/posts/full"/>
  <author>
    <name>Elizabeth Bennet</name>
    <email>liz@gmail.com</email>
  </author>
  <generator version="1.0"
    uri="http://www.example.com">Example Generator Engine</generator>
  <openSearch:totalResults>2</openSearch:totalResults>
  <openSearch:startIndex>0</openSearch:startIndex>
  <entry gd:etag='W/"C0QBRXcycSp7ImA9WxRVGUo."'>
    <id>http://www.example.com/feed/1234.1/posts/full/4521614025009481151</id>
    <published>2005-01-09T08:00:00Z</published>
    <updated>2005-01-09T08:00:00Z</updated>
    <category scheme="http://www.example.com/type" term="blog.post"/>
    <title type="text">This is the title of entry 1009</title>
    <content type="xhtml">
      <div
        xmlns="http://www.w3.org/1999/xhtml">This is the entry body of entry 1009</div>
    </content>
    <link rel="alternate" type="text/html"
      href="http://www.example.com/posturl"/>
    <link rel="edit" type="application/atom+xml"
      href="http://www.example.com/feed/1234.1/posts/full/4521614025009481151"/>
    <author>
      <name>Elizabeth Bennet</name>
      <email>liz@gmail.com</email>
    </author>
  </entry>
  <entry gd:etag='W/"C0QBRXrurSp7ImA9WxRVGUo."'>
    <id>http://www.example.com/feed/1234.1/posts/full/3067545004648931569</id>
    <published>2005-01-07T08:00:00Z</published>
    <updated>2005-01-07T08:02:00Z</updated>
    <category scheme="http://www.example.com/type" term="blog.post"/>
    <title type="text">This is the title of entry 1007</title>
    <content type="xhtml">
      <div
        xmlns="http://www.w3.org/1999/xhtml">This is the entry body of entry 1007</div>
    </content>
    <link rel="alternate" type="text/html"
      href="http://www.example.com/posturl"/>
    <link rel="edit" type="application/atom+xml"
      href="http://www.example.com/feed/1234.1/posts/full/3067545004648931569"/>
    <author>
      <name>Elizabeth Bennet</name>
      <email>liz@gmail.com</email>
    </author>
  </entry>
</feed>

Si le flux demandé est au format Atom, si aucun paramètre de requête n'est spécifié et si le résultat ne contient pas toutes les entrées, l'élément suivant est inséré dans le flux de premier niveau: <link rel="next" type="application/atom+xml" href="..."/>. Elle pointe vers un flux contenant l'ensemble d'entrées suivant. Les ensembles suivants contiennent un élément <link rel="previous" type="application/atom+xml" href="..."/> correspondant. En suivant tous les liens suivants, un client peut récupérer toutes les entrées d'un flux.

Codes d'état HTTP

Le tableau suivant décrit la signification des différents codes d'état HTTP dans le contexte des API Data.

Coder Explication
200 OK Aucune erreur.
CRÉATION 201 La ressource a bien été créée.
304 NON MODIFIÉ La ressource n'a pas changé depuis l'heure spécifiée dans l'en-tête If-Modified-Since de la requête.
DEMANDE DE 400 MAL URI ou en-tête de requête non valide, ou paramètre non standard non compatible.
401 UNAUTHORIZED Autorisation nécessaire.
403 INTERDIT Paramètre standard non compatible, échec de l'authentification ou de l'autorisation.
404 INTROUVABLE Ressource (flux ou entrée, par exemple) introuvable.
409 CONFLICT Le numéro de version spécifié ne correspond pas au dernier numéro de version de la ressource.
410 OK L'historique des modifications demandé n'est plus disponible sur le serveur. Pour en savoir plus, consultez la documentation spécifique au service.
ERREUR DU SERVEUR INTERNE 500 Erreur interne. Il s'agit du code par défaut utilisé pour toutes les erreurs de serveur non reconnues.

Gestion des versions des ressources (ETags)

Vous devez parfois pouvoir faire référence à une version spécifique d'une entrée donnée.

C'est important dans deux cas en particulier:

  • une "extraction conditionnelle" au cours de laquelle votre client demande une entrée et le serveur n'envoie l'entrée que si elle a été modifiée depuis sa dernière demande ;
  • Assurez-vous que plusieurs clients ne remplacent pas les modifications d'un autre utilisateur par inadvertance. Pour ce faire, les API Data mettent à jour et suppriment les données si le client spécifie un ancien identifiant de version pour l'entrée.

Les API Google Data gèrent ces deux cas à l'aide d'ETags, une partie standard de HTTP.

Un ETag est un identifiant qui spécifie une version particulière d'une entrée particulière. Le serveur associe un ETag aux éléments d'entrée et de flux qu'il envoie aux clients. Lorsqu'une entrée ou un flux est modifié, son ETag est également modifié.

Les API Google Data fournissent des ETags à deux endroits: dans un en-tête HTTP ETag, et dans un attribut gd:etag d'éléments <feed> et <entry>.

Dans les API Google Data, un ETag est généralement une chaîne de lettres et de chiffres, parfois incluant des tirets et des points. Il est généralement entre guillemets. (Les guillemets font partie de l'ETag.) Par exemple, voici un ETag provenant d'une entrée de l'API Data : "S0wCTlpIIip7ImA0X0QI".

Il existe deux types d'ETags: forts et faibles. Les ETag forts identifient une version spécifique d'une entrée spécifique et peuvent être utilisés pour éviter d'écraser les modifications d'autres clients. Dans le contexte des API Google Data, les ETags faibles ne sont utilisés que pour la récupération conditionnelle. Un ETag faible commence toujours par W/. Par exemple : W/"D08FQn8-eil7ImA9WxZbFEw."

Toutes les API Google Data ne sont pas compatibles avec les ETag puissants. Pour ceux qui le font, les ETag efficaces ne sont utilisés que pour les entrées. Les ETags sur les flux sont toujours faibles.

Voici un exemple de flux (avec certains en-têtes HTTP) récupéré à partir d'un service compatible avec les ETag forts:

GData-Version: 2.0
ETag: W/"C0QBRXcycSp7ImA9WxRVFUk."
...
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
    xmlns:gd='http://schemas.google.com/g/2005'
    gd:etag='W/"C0QBRXcycSp7ImA9WxRVFUk."'>
  ...
  <entry gd:etag='"CUUEQX47eCp7ImA9WxRVEkQ."'>
    ...
  </entry>
</feed>

Les bibliothèques clientes compatibles avec la version 2 des API de données gèrent les ETags de manière transparente. Les informations suivantes s'adressent aux clients qui n'utilisent pas de bibliothèques clientes, ainsi qu'aux lecteurs intéressés par la gestion des versions au niveau du protocole.

Remarque: Pour plus d'informations sur le système de gestion des versions des ressources utilisé dans la version 1.0 des API Data, consultez le guide de référence de la version 1.0.

Récupération conditionnelle

Si vous souhaitez récupérer une entrée que vous avez déjà récupérée, vous pouvez gagner en efficacité en demandant au serveur de n'envoyer l'entrée que si elle a été modifiée depuis sa dernière récupération.

Pour effectuer ce type de récupération conditionnelle, envoyez une requête HTTP GET incluant un en-tête HTTP If-None-Match. Dans l'en-tête, spécifiez l'ETag de l'entrée.

Voici un exemple d'en-tête If-None-Match:

If-None-Match: W/"D08FQn8-eil7ImA9WxZbFEw."

Lorsque le serveur reçoit cette requête, il vérifie si l'entrée que vous avez demandée possède le même ETag que celui que vous avez spécifié. Si les ETags correspondent, l'entrée n'a pas changé et le serveur renvoie un code d'état HTTP 304 Not Modified.

Si les ETag ne correspondent pas, cela signifie que l'entrée a été modifiée depuis votre dernière demande et que le serveur la renvoie.

Mise à jour des entrées

La manière la plus simple d'éviter d'écraser les modifications d'un autre client est que le serveur s'assure que lorsque votre client envoie une entrée mise à jour, la version de l'entrée avec laquelle votre client a commencé est identique à la version actuelle stockée par le serveur. Si un second client effectue une mise à jour avant le vôtre, la mise à jour est refusée, car le client ne base plus ses modifications sur la dernière version.

Lorsque votre client extrait des données d'un service compatible avec les ETag forts, chaque entrée possède un ETag qui agit comme un identifiant de version unique pour cette version de cette entrée.

Remarque : La mise à jour à l'aide d'ETags ne fonctionne qu'avec des ETags forts. Pour les services qui fournissent des ETags faibles, toutes les mises à jour aboutissent, que l'entrée ait été mise à jour ou non par quelqu'un d'autre. La dernière mise à jour remplace toujours les autres mises à jour précédentes. Par conséquent, n'envoyez pas d'ETag faible lors de la mise à jour ou de la suppression, car un message d'erreur s'affichera.

Ainsi, lorsque votre client envoie une mise à jour à un service avec ETags forts, il doit spécifier la version de l'entrée qu'il met à jour. Deux méthodes sont possibles :

  • Utilisez un en-tête HTTP If-Match.
  • Utilisez l'attribut gd:etag dans l'élément <atom:entry>.

Nous vous recommandons d'utiliser l'approche If-Match lorsque cela est possible.

Pour mettre à jour une entrée à l'aide de If-Match, commencez par acquérir l'entrée que vous mettez à jour. Apportez les modifications souhaitées à l'entrée, puis créez une nouvelle requête PUT contenant l'entrée modifiée. (Pour en savoir plus sur les URL à utiliser, consultez la documentation spécifique au service.)

Avant d'envoyer le PUT, ajoutez un en-tête HTTP If-Match contenant l'ETag de l'entrée d'origine:

If-Match: "S0wCTlpIIip7ImA0X0QI"

Envoyez ensuite la requête PUT.

Si la mise à jour réussit, le serveur renvoie un code d'état HTTP 200 OK et une copie de l'entrée mise à jour.

Si la mise à jour échoue parce que l'ETag que vous avez spécifié ne correspond pas à l'ETag actuel de l'entrée (ce qui implique que l'entrée a été modifiée sur le serveur depuis la dernière récupération), le serveur renvoie un code d'état HTTP 412 Precondition Failed.

Si vous ne parvenez pas à écrire facilement les en-têtes HTTP ou si vous avez d'autres raisons d'éviter d'utiliser l'en-tête If-Match, vous pouvez utiliser l'attribut gd:etag.

Si vous n'envoyez pas d'en-tête If-Match, le serveur utilise la valeur d'attribut gd:etag de l'entrée mise à jour comme If-Match implicite.

Pour remplacer le système de gestion des versions et mettre à jour l'entrée même si quelqu'un d'autre l'a mise à jour depuis que vous l'avez récupérée, utilisez If-Match: * au lieu de spécifier l'ETag dans l'en-tête.

Pour en savoir plus sur les services compatibles avec les ETag forts, consultez le guide de migration.

Suppression des entrées

La suppression des entrées qui utilisent des ETag forts ressemble beaucoup à leur mise à jour.

Pour supprimer une entrée dont l'ETag est fort, commencez par récupérer l'entrée à supprimer, puis envoyez une requête DELETE à l'URL de modification de l'entrée.

Pour vous assurer de ne pas supprimer une entrée qui a été modifiée par un autre client depuis sa récupération, incluez un en-tête HTTP If-Match contenant la valeur ETag de l'entrée d'origine.

Si vous souhaitez remplacer le système de gestion des versions et supprimer l'entrée, qu'un autre utilisateur l'ait mise à jour ou non, utilisez If-Match: * au lieu de spécifier l'ETag dans l'en-tête.

Si une entrée ne possède pas d'ETag fort, une requête DELETE aboutit toujours.

Réponse partielle (fonctionnalité expérimentale)

Par défaut, le serveur renvoie la représentation complète de la ressource cible après le traitement des requêtes. Une réponse partielle vous permet de ne demander que les éléments ou les attributs qui vous intéressent, plutôt que la représentation complète de la ressource. Cela permet à votre application cliente d'éviter de transférer, d'analyser et de stocker des champs inutiles. Elle peut ainsi utiliser plus efficacement les ressources réseau, de processeur et de mémoire.

Pour savoir si une réponse partielle est disponible pour le produit que vous utilisez, consultez sa documentation sur l'API.

Pour demander une réponse partielle, utilisez le paramètre de requête fields afin de spécifier les éléments ou les attributs que vous souhaitez afficher. Voici un exemple:

http://www.example.com/feeds?fields=link,entry(@gd:etag,id,updated,link[@rel='edit']))

La réponse du serveur ne contient que des éléments link et entry pour le flux. Ces éléments contiennent uniquement les informations ETag, ID, mises à jour et lien. La syntaxe des paramètres de requête fields est traitée dans les sections suivantes. Pour en savoir plus sur la réponse, consultez Gérer les réponses partielles.

Remarque : Vous pouvez utiliser le paramètre de requête fields avec toute requête qui renvoie des données. En plus de GET, cela inclut POST et PUT (ainsi que PATCH, qui permet d'effectuer des mises à jour partielles). Toutefois, le paramètre de requête fields n'affecte que les données de réponse. Il n'a aucune incidence sur les données que vous devez fournir ni sur les champs mis à jour ou créés.

Récapitulatif de la syntaxe du paramètre "fields"

Le format de la valeur du paramètre de requête fields est basé sur la syntaxe XPath. Cependant, il n'accepte qu'un sous-ensemble d'expressions XPath valides. La syntaxe acceptée est résumée ci-dessous, et des exemples supplémentaires sont présentés dans la section suivante.

  • Utilisez une liste d'éléments séparés par une virgule pour sélectionner plusieurs champs.
  • Incluez a/b pour sélectionner un élément b imbriqué dans l'élément a. Incluez a/b/c pour sélectionner un élément c imbriqué dans l'élément b.
  • Utilisez le préfixe '@' pour identifier un attribut avec le nom donné ; omettez le préfixe '@' pour faire référence à un élément.
  • Appliquez des conditions de champ pour sélectionner des éléments correspondant à certains critères, en plaçant des expressions entre crochets "[ ]" après l'élément que vous souhaitez restreindre.

    Par exemple, fields=entry[author/name='Elizabeth'] ne renvoie que les entrées de flux dont Elizabeth est l'auteur.

  • Spécifiez des sous-sélecteurs de champ pour ne demander que des attributs ou des sous-éléments spécifiques. Pour ce faire, placez les expressions entre parenthèses "( )" après l'élément sélectionné.

    Par exemple, fields=entry(id,author/email) ne renvoie que l'ID et l'adresse e-mail de l'auteur pour chaque entrée de flux.

  • Vous pouvez délimiter les chaînes à l'aide de guillemets doubles ou simples.

    Pour échapper une citation double ou unique, répétez le guillemet. Par exemple, """Hello,"" he said" génère la chaîne "Hello," he said et '''Hello,'' he said' génère la chaîne 'Hello,' he said.
  • Vous pouvez utiliser des caractères génériques dans les sélections de champs.

    Par exemple, entry/gd:* sélectionne tous les éléments enfants de l'espace de noms gd, et entry/@gd:* sélectionne les attributs d'élément enfant du même espace de noms.

Le paramètre de requête fields agit comme un filtre de sortie. Cela signifie que la réponse partielle n'est calculée qu'après le traitement du reste de la requête. Par exemple, si vous spécifiez également un paramètre de requête max-results pour indiquer que vous souhaitez obtenir 20 résultats par page, les 20 premiers résultats sont générés et la réponse partielle est calculée à partir de celle-ci. Si la spécification fields ne correspond à aucune des 20 premières entrées sélectionnées par la requête, vous recevez un flux vide. Vous ne récupérez pas les 20 premières entrées correspondantes.

Remarque : N'essayez pas d'utiliser les conditions de champ comme sélecteurs de requête. En d'autres termes, n'essayez pas de récupérer un flux complet et n'appliquez pas de conditions de champ pour exclure des éléments intéressants d'un ensemble de données très volumineux. Dans la mesure du possible, utilisez d'autres paramètres de requête, tels que start-index et max-results, pour réduire les résultats de chaque requête à une taille gérable. Sinon, les gains de performances possibles avec une réponse partielle pourraient être compensés par la grave dégradation des performances due à une utilisation incorrecte.

Mettre en forme la valeur du paramètre "fields"

Les consignes suivantes expliquent comment construire la valeur du paramètre de requête fields. Chaque consigne inclut des exemples et des descriptions de l'impact de la valeur du paramètre sur la réponse.

Remarque : Comme toutes les valeurs de paramètre de requête, la valeur du paramètre fields doit être encodée au format URL. Pour une meilleure lisibilité, les exemples ci-dessous omettent l'encodage.

Identifiez les champs devant être renvoyés ou effectuez des sélections de champs.
La valeur du paramètre de requête fields est une liste d'éléments ou d'attributs séparés par une virgule (collectivement appelés champs). Chaque champ est spécifié par rapport à l'élément racine de la représentation de la ressource. Ainsi, si vous récupérez un flux, les champs sont spécifiés par rapport à l'élément <feed> et, si vous récupérez une seule entrée, les champs sont spécifiés par rapport à l'élément <entry>. Si l'élément sélectionné est un élément récurrent dans le flux ou en fait partie, le service renvoie toutes les instances de cet élément.

Voici quelques exemples au niveau du flux:
Exemples Effet
entry Renvoie tous les éléments <entry> et tous les sous-éléments de ces entrées, mais aucun autre élément enfant de <feed>.
id,entry Renvoie le flux <id> et tous les éléments <entry>.
entry/title Renvoie l'élément <title> pour toutes les entrées de flux.

Chaque fois qu'un élément imbriqué est renvoyé, la réponse inclut des tags englobants pour tous les éléments parents . Les balises parentes n'incluent pas d'autres éléments ou attributs enfants, sauf si ceux-ci sont également sélectionnés explicitement.
entry/author/uri Renvoie seulement le sous-élément <uri> de l'élément <author> pour toutes les entrées de flux.
entry/*:rating Renvoie uniquement les sous-éléments ayant le nom local rating dans un espace de noms pour toutes les entrées de flux.

Voici quelques exemples d'éléments de base :
Exemples Effet
author Renvoie l'élément enfant <author> de l'entrée cible.
@gd:etag Renvoie l'attribut etag de l'entrée cible.
author/uri Renvoie le sous-élément <uri> de l'élément <author> pour l'entrée cible.
media:group/media:* Renvoie tous les sous-champs de <media:group> dans l'espace de noms media pour l'entrée cible.
Limiter la réponse aux champs sélectionnés qui correspondent à certains critères ou utiliser des conditions de champ.
Par défaut, si votre requête spécifie un élément qui se produit plusieurs fois, la réponse partielle inclut toutes les instances de cet élément. Toutefois, vous pouvez également spécifier que la réponse ne doit inclure que des éléments ayant une valeur d'attribut particulière ou des éléments remplissant une autre condition à l'aide de la syntaxe "[ ]", comme illustré dans les exemples ci-dessous. Pour en savoir plus, consultez la section Syntaxe des conditions de champs.
Exemples Effet
entry[link/@rel='edit'] Renvoie toutes les entrées de flux contenant un élément <link> avec une valeur d'attribut rel de 'edit'.
entry/title[text()='Today'] Renvoie tous les éléments <title> qui apparaissent dans les entrées de flux si leur contenu est 'Today'.
entry/author[name='Jo'] Renvoie tous les éléments <author> qui apparaissent dans les entrées de flux s'ils comportent un sous-élément <name> avec du contenu 'Jo'.
author[name='Jo'] Renvoie l'élément <author> dans l'entrée cible s'il comporte un sous-élément <name> avec du contenu 'Jo'.
Ne demandez que certaines parties des éléments sélectionnés ou utilisez des sous-sélections de champs.
Par défaut, si votre requête spécifie des éléments particuliers, le service les renvoie intégralement. Vous pouvez spécifier que la réponse ne doit inclure que certains sous-éléments dans les éléments sélectionnés. Pour ce faire, utilisez la syntaxe de sous-sélection "( )", comme dans les exemples ci-dessous.
Exemples Effet
entry/author(uri) Renvoie uniquement le sous-élément <uri> pour les auteurs dans les entrées de flux.
entry/author[name='Jo'](uri) Renvoie uniquement le sous-élément <uri> de <author> pour toutes les entrées dont le nom d'auteur est 'Jo'.
entry(link(@rel,@href)) Renvoie seulement les valeurs des attributs rel et href pour chaque élément <link> des entrées de flux.
entry(title,link[@rel='edit']) Renvoie uniquement les éléments <title> et <link> avec les attributs rel modifiés pour chaque entrée de flux.
entry(title,author(uri) Renvoie à la fois des éléments <title> et des éléments <uri> d'auteur pour chaque entrée de flux.

En savoir plus sur la syntaxe des conditions de champ

Vous pouvez utiliser des conditions de champ avec des champs ou des sous-champs. La condition doit être évaluée à true pour que le champ sélectionné soit inclus dans les résultats.S'il n'y a pas de condition de champ, tous les champs du type sélectionné sont inclus.

La valeur de texte du champ sélectionné est utilisée pour les comparaisons. Dans ce contexte, si le champ est un élément, la valeur de texte correspond à son contenu. Si le champ est un attribut, la valeur de texte est la valeur de l'attribut. Si le champ ne contient aucune valeur de texte, la comparaison échoue et le champ n'est pas inclus dans les résultats.

Le tableau suivant présente les opérateurs XPath compatibles avec les conditions de champ et fournit quelques exemples.

Opérateur Syntaxe Exemples
Comparaison de chaînes

= ou eq
!= ou ne

  • Renvoie l'entrée complète si elle contient un élément <link> avec un attribut rel défini sur "self'" :
        entry[link/@rel='self']

  • Renvoie l'entrée entière si elle contient un élément <title> dont le contenu est égal à la chaîne 'unknown' :
        entry[title eq 'unknown']

  • Renvoie l'intégralité de l'élément <title> si la valeur de son élément n'est pas 'unknown':
        title[text() != 'unknown']
Comparaison logique and
or
not
  • Renvoie tous les liens dont l'attribut rel est défini sur 'self' ou 'edit':
        link[@rel='self' or @rel='edit']

  • Renvoie tout lien ayant un attribut rel défini sur 'self' et un attribut type défini sur 'application/atom+xml' :
        link[@rel='self' and @type='application/atom+xml']

  • Renvoie tout lien qui n'a pas d'attribut rel avec la valeur 'self' :
        link[not(@rel='self')]

    Notez que, comme dans XPath, not ressemble à un appel de fonction.
Comparaison numérique = ou eq
!= ou ne
> ou gt
>=, ge
< ou lt
<= ou le
  • Renvoie tout élément <gd:rating> avec un attribut value qui peut être transformé en entier 5:
        gd:rating[@value=5]

  • Renvoie tout élément <gd:rating> avec un attribut average qui peut être transformé en une valeur flottante supérieure à 4.3 :
        gd:rating[@average gt 4.3]
Comparaison de dates Utilisez des opérateurs de comparaison numériques, comme illustré dans les exemples.

Pour effectuer des comparaisons par date ou heure, vous pouvez convertir des éléments, des attributs ou des littéraux de chaîne dans xs:date ou xs:dateTime. Pour xs:dateTime, le fuseau horaire par défaut est UTC, mais il est préférable de le spécifier explicitement.

  • Renvoie tout élément <yt:recorded> contenant une date depuis le 1er janvier 2005:
        yt:recorded[xs:date(text())>=xs:date('2005-01-01')]

  • Renvoie toutes les entrées mises à jour après l'heure indiquée, dans le fuseau horaire UTC:
        entry[xs:dateTime(updated)>xs:dateTime('2008-07-25T08:19:37.549Z')]
Existence

Utilisez le nom de l'élément ou de l'attribut comme indiqué dans les exemples.

  • Renvoie toutes les entrées contenant un lien avec un attribut rel:
        entry[link/@rel]

  • Renvoie tous les éléments <gd:rating> comportant un attribut appelé value :
        entry/gd:rating[@value]
Booléen true()
false()

Les opérateurs booléens peuvent être utiles lors des tests pour forcer l'état des champs à un état vrai ou faux.

  • Renvoie les éléments <link>:
        link[true()]

Traitement des réponses partielles

Lorsqu'un serveur compatible avec la réponse partielle traite une requête valide incluant le paramètre de requête fields, il renvoie le code d'état HTTP 200 OK ainsi que les attributs ou les éléments demandés. Si le paramètre de requête fields comporte une erreur ou n'est pas valide, le serveur renvoie un code d'état HTTP 400 Bad Request.

L'élément racine de la réponse est <feed> ou <entry>, selon l'URI cible. Le contenu de l'élément racine ne comprend que les champs sélectionnés pour ce flux ou cette entrée, ainsi que les balises englobantes pour tous les éléments parents.

La valeur du paramètre de requête fields de la requête peut être renvoyée de deux manières:

  • L'élément racine possède un attribut gd:fields qui indique la valeur du paramètre de requête fields spécifié dans la requête.
  • Si l'URI cible est un flux, chaque entrée modifiable possède un attribut gd:fields qui indique la partie de la sélection fields qui lui est associée.

Remarque:Pour que ces valeurs d'attribut gd:fields s'affichent dans votre réponse partielle, vous devez les inclure dans la spécification du paramètre de requête fields. Vous pouvez le faire explicitement en utilisant @gd:fields ou en utilisant le @gd:* plus général, qui inclut également des informations ETag.

L'exemple de requête suivant demande au serveur de renvoyer un document qui ne contient que des attributs dans l'espace de noms gd (au niveau du flux et de l'entrée), ainsi que l'ID, le titre et le lien de modification de chaque entrée de flux:

http://example.com/myFeed?fields=@gd:*,id,entry(@gd:*,title,link[@rel='edit'])

Le serveur renvoie la réponse partielle suivante, ainsi qu'un code d'état HTTP 200 Successful:

<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
    xmlns:gd='http://schemas.google.com/g/2005'
    gd:etag='W/"DEAEQH47eCp7IWA9WxBVGUo."'
    gd:fields='@gd:*,id,entry(@gd:*,title,link[@rel='edit'])>
  <id>http://example.com/myFeed</id>
  <entry gd:etag='"EksPTg1Bfyp7IWA6WhJT"'
      gd:fields="@gd:*,title,link[@rel='edit']">
    <link rel='edit' href='http://example.com/myFeed/1/'/>
    <title>This year</title>
  </entry>
  <entry gd:etag='"EksPQA1Cdyp7IWA6WhJT"'
      gd:fields="@gd:*,title,link[@rel='edit']">
    <link rel='edit' href='http://example.com/myFeed/2/'/>
    <title>Last year</title>
  </entry>
  <entry d:etag='"EksPQAxHeCp7IWA6WhJT"'
      gd:fields="@gd:*,title,link[@rel='edit']">
    <link rel='edit' href='http://example.com/myFeed/3/'/>
    <title>Today</title>
  </entry>
</feed>

Si les champs sélectionnés ne correspondent à aucun élément, le service renvoie toujours un code d'état HTTP 200 Successful, mais la réponse partielle est un flux vide:

<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
  xmlns:gd='http://schemas.google.com/g/2005'
  gd:etag='W/"DEAEQH47eCp7IWA9WxBVGUo."'
  gd:fields='@gd:*,id,entry(@gd:*,title,link[@rel='edit'])>
</feed>

Mise à jour partielle (fonctionnalité expérimentale)

Les produits Google qui acceptent une réponse partielle et des ressources modifiables vous permettent également d'utiliser une mise à jour partielle. Avec une mise à jour partielle, vous n'envoyez que les champs que vous souhaitez mettre à jour, et non une version modifiée de la représentation complète de la ressource. Cela permet à votre application cliente d'être plus efficace lorsqu'elle effectue des mises à jour ou d'utiliser une réponse partielle pour récupérer des données.

Cependant, au lieu d'utiliser PUT, vous devez utiliser une requête PATCH lorsque vous effectuez une mise à jour partielle. La sémantique de PATCH est suffisamment puissante pour vous permettre d'ajouter, de remplacer et de supprimer des champs spécifiques pour une entrée particulière, le tout avec une seule requête.

Pour savoir si une mise à jour partielle est disponible pour le produit que vous utilisez, consultez la documentation spécifique à ce produit.

Envoyer une demande de mise à jour partielle

Pour envoyer une requête de mise à jour partielle, envoyez une requête HTTP PATCH à la même URL que celle que vous utilisez habituellement avec PUT pour mettre à jour la ressource. Le corps de la requête PATCH est un élément <entry> partiel qui spécifie les champs que vous souhaitez ajouter ou modifier. L'attribut gd:fields de l'entrée indique les champs que vous souhaitez supprimer.

Le serveur traite les requêtes PATCH dans un ordre spécifique:

  1. Il commence par supprimer de la représentation de la ressource les champs spécifiés par l'attribut gd:fields.

    La syntaxe de l'attribut gd:fields est identique à celle du paramètre de requête fields utilisé pour demander une réponse partielle. Pour en savoir plus, consultez Syntaxe acceptée.

  2. Les données fournies dans le corps de la requête sont ensuite fusionnées dans la représentation existante de la ressource.

    Pour en savoir plus sur la fusion des données, consultez Ajouter ou mettre à jour des champs ci-dessous.

Remarque : Étant donné que le corps d'une requête PATCH n'est généralement pas conforme au format de syndication Atom, le Content-Type que vous utilisez avec une requête PATCH est application/xml.

Voici un exemple de requête de mise à jour partielle:

PATCH /myFeed/1/1/
Content-Type: application/xml

<entry xmlns='http://www.w3.org/2005/Atom'
    xmlns:gd='http://schemas.google.com/g/2005'
    gd:fields='description'>
  <title>New title</title>
</entry>

Cette requête PATCH apporte les modifications suivantes à la représentation de la ressource stockée sur le serveur pour l'entrée de l'URI cible:

  • Supprime l'élément <description>.
  • Met à jour l'élément <title>.

Sémantique d'une requête de mise à jour partielle

Les instructions ci-dessous expliquent comment configurer votre requête PATCH pour supprimer, ajouter ou mettre à jour des champs spécifiques dans une entrée. Une seule requête PATCH peut effectuer n'importe quelle combinaison de ces opérations.

  • Suppression des champs. Utilisez l'attribut gd:fields de l'élément <entry> pour identifier les champs que vous souhaitez supprimer de la ressource. L'exemple de requête suivant supprime le titre et le résumé associés à une entrée. Cependant, la requête n'ajoute ni ne met à jour d'autres données pour l'entrée.

    PATCH /myfeed/1/1/
    Content-Type: application/xml
    
    <entry xmlns='http://www.w3.org/2005/Atom'
        xmlns:gd='http://schemas.google.com/g/2005'
        gd:fields='title,summary'/>
    
  • Ajout ou mise à jour de champs. Utilisez le corps de l'élément <entry> pour spécifier les données que vous souhaitez ajouter ou mettre à jour pour une ressource. Ces champs sont fusionnés dans les données existantes de la ressource après toute suppression, conformément aux règles suivantes:

    • Des champs qui n'existent pas déjà sont ajoutés. Si les données de ressources ne spécifient pas déjà de valeur pour un champ, ce champ est ajouté aux données existantes. Par exemple, si une entrée n'a pas de titre et que votre requête PATCH contient un élément <title>, le nouveau titre est ajouté.

    • Les champs déjà présents sont remplacés ou ajoutés. Le comportement spécifique à la fusion des champs déjà spécifiés dans les données de ressources dépend des caractéristiques du champ:

      • Les champs non répétés sont remplacés. Si les données de ressource spécifient déjà une valeur pour un élément non récurrent, la valeur que vous spécifiez dans la requête PATCH remplace la valeur existante de cet élément. Dans l'exemple ci-dessous, le nouveau titre remplace le titre existant.

        PATCH /myFeed/1/1/
        Content-Type: application/xml
        
          <entry xmlns='http://www.w3.org/2005/Atom'
            xmlns:gd='http://schemas.google.com/g/2005'>
          <title>New Title</title>
        </entry>

        Voici un exemple plus complexe. Dans cet exemple, nous supposons que l'entrée ne peut avoir qu'un seul auteur et que la ressource cible contient déjà des valeurs pour le nom et l'adresse e-mail de l'auteur. Même si l'élément <author> comporte deux champs enfants, seul l'élément <name> est présent dans les données fournies. Par conséquent, seule la valeur de ce champ est remplacée. La valeur de l'élément <email>, qui ne figure pas dans les données fournies, reste inchangée.

        PATCH /myfeed/1/1/
        Content-Type: application/xml
        
        <entry xmlns='http://www.w3.org/2005/Atom'
            xmlns:gd='http://schemas.google.com/g/2005'>
          <author>
            <name>New Name</name>
          </author>
        </entry>
      • Des champs répétés sont ajoutés. Si les données de ressource spécifient déjà une valeur pour un élément récurrent, le nouvel élément que vous fournissez est ajouté à l'ensemble de valeurs existant.

        Notez qu'il peut arriver que vous souhaitiez ajouter une autre instance d'un élément récurrent. Par exemple, vous pouvez effectuer l'une des opérations suivantes:

        • Remplacez une liste entière d'éléments récurrents. Vous pouvez supprimer tous les champs répétés à l'aide de l'attribut gd:fields (gd:fields='ns:accessControl', par exemple) et fournir un ensemble complet de champs de remplacement. Étant donné que tous les éléments existants sont supprimés en premier, l'ensemble des champs que vous fournissez n'entre pas en conflit avec les valeurs existantes lorsqu'ils sont ajoutés.

        • Remplacez une valeur dans un ensemble de valeurs existantes pour un élément récurrent. Dans ce cas, il vous suffit de supprimer un seul élément en définissant la valeur gd:fields suffisamment précisément pour éviter de supprimer les autres valeurs que vous souhaitez conserver. Par exemple, pour supprimer uniquement un contrôle d'accès avec un action de embed, vous pouvez utiliser gd:fields='ns:accessControl[@action="embed"]'. Spécifiez ensuite le champ unique dans lequel vous souhaitez le remplacer dans le corps de l'élément <entry>:

          PATCH /myfeed/1/1/
          Content-Type: application/xml
          
          <entry xmlns='http://www.w3.org/2005/Atom'
              xmlns:gd='http://schemas.google.com/g/2005'
              gd:fields='ns:accessControl[@action="embed"]>
            <ns:accessControl action="embed" permission="allowed" />
          </entry>

Traiter la réponse à une mise à jour partielle

Après avoir traité une requête de mise à jour partielle valide, l'API renvoie un code de réponse HTTP 200 OK. Par défaut, le corps de la réponse est l'entrée complète que vous avez mise à jour. Le serveur met à jour les valeurs ETag lorsqu'il réussit à traiter une requête PATCH, tout comme avec PUT.

Si une requête PATCH génère un nouvel état de ressource incorrect au niveau syntaxique ou sémantique, le serveur renvoie un code d'état HTTP HTTP 400 Bad Request ou 422 Unprocessable Entity, et l'état de la ressource reste inchangé. Par exemple, si vous tentez de supprimer un champ obligatoire sans fournir de remplacement, le serveur renvoie une erreur.

Remarque:Il est important de comprendre les relations entre les différents champs. Il est possible de mettre une ressource dans un état incohérent en ne mettant à jour qu'une partie des valeurs mutuellement interdépendantes. Par exemple, il est possible de remplacer une heure de début par une valeur ultérieure à une heure de fin. Bien que l'API doive renvoyer un code d'erreur, nous vous recommandons de tester entièrement ces types de conditions pour garantir la cohérence.

Autre notation lorsque PATCH n'est pas compatible

Si votre pare-feu n'autorise pas PATCH, exécutez une requête HTTP POST et définissez l'en-tête de remplacement sur PATCH, comme indiqué ci-dessous:

POST /myfeed/1/1/
X-HTTP-Method-Override: PATCH
Content-Type: application/xml
...

Utiliser une réponse partielle avec une mise à jour partielle

Vous pouvez utiliser une réponse partielle comme base pour une requête de mise à jour partielle ultérieure. Si vous procédez ainsi, spécifiez un paramètre de requête fields qui inclut des liens de modification, ainsi que @gd:*. Cela permet de garantir que la réponse partielle inclut des informations telles que les valeurs d'attribut ETag et gd:fields, qui sont importantes pour les requêtes ultérieures.

Voici un exemple qui renvoie une réponse partielle que vous pouvez utiliser comme base pour une future mise à jour partielle:

http://example.com/myFeed/1/1/?fields=@gd:*,link[@rel='edit'](@href),gd:who

Le serveur répond:

<?xml version='1.0' encoding='utf-8'?>
<entry xmlns='http://www.w3.org/2005/Atom'
    xmlns:gd='http://schemas.google.com/g/2005'
    gd:etag='"E0UKRAREeCp7IWA6WhJT"'
    gd:fields="@gd;*,link[@rel='edit'](@href),gd:who">
  <link href='http://example.com/myFeed/1/1/'/>
  <gd:who email='liz@gmail.com'/>
  <gd:who email='jo@gmail.com'/>
  <gd:who email='jane@gmail.com'/>
</entry>

Supposons que vous souhaitiez supprimer l'utilisateur dont l'adresse e-mail est 'jane@gmail.com', ajouter un utilisateur dont l'adresse e-mail est 'will@gmail.com', et remplacer l'adresse e-mail 'jo@gmail.com' de l'utilisateur actuellement répertorié par 'josy@gmail.com'.

Vous pouvez effectuer ces modifications simplement en commençant par les résultats de la réponse précédente, en ne modifiant que les champs différents, puis en envoyant l'entrée partielle modifiée en tant que corps de la requête PATCH. Dans cet exemple, les modifications requises sont les suivantes:

  • Supprimez <gd:who email='jane'/> de la liste des éléments fournis.
  • Ajoutez <gd:who email='will@gmail.com'/> à la liste des éléments fournis.
  • Remplacez <gd:who email='jo@gmail.com'/> par <gd:who email='josy@gmail.com'/>.

La requête PATCH basée sur une réponse partielle sera présentée ci-dessous:

PATCH /myFeed/1/1/
Content-Type: application/xml

<entry gd:fields="@gd:*,link[@rel='edit'](@href),gd:who"
    gd:etag="FE8LQQJJeSp7IWA6WhVa">
  <link href='http://example.com/myFeed/1/1'/>
  <gd:who email='liz@gmail.com'/>
  <gd:who email='josy@gmail.com'/>
  <gd:who email='will@gmail.com'/>
</entry>

Remarque : Cette approche consiste à inclure les attributs gd:fields et gd:etag (si compatibles) dans la réponse partielle de l'entrée. Le corps de l'entrée partielle doit conserver tous les champs et attributs qui étaient présents dans la réponse partielle, à l'exception de ceux que vous souhaitez explicitement supprimer. Vous pouvez mettre à jour tous les champs existants dans le corps avec de nouvelles valeurs, et inclure tous les nouveaux champs que vous souhaitez ajouter.

Authentification

Lorsqu'un client tente d'accéder à un service, il peut être amené à lui fournir ses identifiants afin de prouver qu'il est autorisé à effectuer l'action en question.

L'approche qu'un client doit utiliser pour l'authentification dépend du type de client:

Dans le système ClientLogin, le client de bureau demande à l'utilisateur ses identifiants, puis les envoie au système d'authentification de Google.

Si l'authentification réussit, le système renvoie un jeton que le client utilise par la suite (dans un en-tête d'autorisation HTTP) lorsqu'il envoie des requêtes API Data.

Si l'authentification échoue, le serveur renvoie un code d'état 403 "Interdit" accompagné d'un en-tête WWW-Authenticate incluant une question d'authentification applicable à l'authentification.

Le système AuthSub fonctionne de la même manière, mais au lieu de demander ses identifiants à l'utilisateur, il le connecte à un service Google qui les demande. Le service renvoie ensuite un jeton que l'application Web peut utiliser. L'avantage de cette approche est que Google (plutôt que le frontal Web) traite et stocke les identifiants de l'utilisateur de manière sécurisée.

Pour en savoir plus sur ces systèmes d'authentification, consultez la présentation de l'authentification des API Google Data ou la documentation sur l'authentification des comptes Google.

État de la session

De nombreuses implémentations de la logique métier nécessitent de maintenir la durée de session, ce qui permet de suivre l'état de la session d'un utilisateur.

Google suit l'état de la session de deux façons: en utilisant des cookies et en utilisant un jeton qui peut être envoyé en tant que paramètre de requête. Les deux méthodes produisent le même effet. Nous recommandons aux clients d'accepter l'une de ces méthodes de suivi de l'état de la session (une seule suffit). Si un client n'accepte aucune de ces méthodes, il fonctionnera toujours avec les API Data, mais les performances risquent d'en pâtir par rapport à ceux qui les acceptent. Plus précisément, si un client n'accepte pas ces méthodes, chaque requête entraîne une redirection. Par conséquent, chaque requête (et toutes les données associées) est envoyée deux fois au serveur, ce qui affecte les performances du client et du serveur.

Les bibliothèques clientes Google gèrent automatiquement l'état des sessions. Par conséquent, si vous utilisez nos bibliothèques, vous n'avez rien à faire pour bénéficier de l'assistance relative à l'état de la session.

Ressources supplémentaires

Les documents tiers suivants peuvent vous être utiles:

Haut de page