Warnung: Diese Seite bezieht sich auf die älteren Google Data APIs. Sie ist nur für die APIs relevant, die im Verzeichnis der Google Data APIs aufgeführt sind. Viele davon wurden durch neuere APIs ersetzt. Informationen zu einer bestimmten neuen API finden Sie in der Dokumentation der neuen API. Informationen zum Autorisieren von Anfragen mit einer neueren API finden Sie unter Authentifizierung und Autorisierung von Google-Konten.
In diesem Dokument wird das Google-Datenprotokoll beschrieben, das von vielen Google APIs verwendet wird, einschließlich Informationen dazu, wie eine Abfrage aussieht, wie Ergebnisse aussehen usw.
Weitere Informationen zum Google-Datenprotokoll finden Sie auf der Übersichtsseite des Entwicklerhandbuchs und im Dokument Grundlagen des Protokolls.
Zielgruppe
Dieses Dokument richtet sich an Nutzer, die mehr über die Details des XML-Formats und Protokolls erfahren möchten, das von den APIs verwendet wird, die das Google-Datenprotokoll implementieren.
Wenn Sie nur Code schreiben möchten, der eine dieser APIs verwendet, brauchen Sie diese Details nicht zu kennen. Verwenden Sie stattdessen die sprachspezifischen Clientbibliotheken.
Informationen zu diesem Protokoll finden Sie in diesem Dokument. In diesem Dokument finden Sie beispielsweise die folgenden Informationen:
- Bewertung der Architektur des Google-Datenprotokolls
- Codierung mit dem Protokoll, ohne die bereitgestellten Clientbibliotheken zu verwenden
- Clientbibliothek in einer neuen Sprache schreiben
In diesem Dokument wird davon ausgegangen, dass Sie mit den Grundlagen von XML, Namespaces, syndizierten Feeds und den GET
-, POST
-, PUT
- und DELETE
-Anfragen in HTTP sowie dem HTTP-Konzept einer Ressource vertraut sind. Weitere Informationen hierzu finden Sie im Abschnitt Zusätzliche Ressourcen in diesem Dokument.
Für dieses Dokument ist keine bestimmte Programmiersprache erforderlich. Sie können Google Data Protocol-Nachrichten mit jeder Programmiersprache senden und empfangen, mit der Sie HTTP-Anfragen senden und XML-basierte Antworten parsen können.
Protokolldetails
In diesem Abschnitt werden das Format und die Abfragesyntax von Google Data Protocol beschrieben.
Dokumentformat
Das Google-Datenprotokoll und Atom verwenden dasselbe grundlegende Datenmodell: ein Container, der sowohl globale Daten als auch eine beliebige Anzahl von Einträgen enthält. Für jedes Protokoll wird das Format durch ein Basisschema definiert. Es kann jedoch mit fremden Namespaces erweitert werden.
Atom ist das Standardformat für das Google-Datenprotokoll. Wenn Sie eine Antwort in einem anderen Format anfordern möchten, verwenden Sie den alt
-Abfrageparameter. Weitere Informationen finden Sie unter Abfrageanfragen.
Hinweis: Die meisten Google Data Protocol-Feeds im Atom-Format verwenden den Atom-Namespace als Standard-Namespace. Geben Sie dazu für das Feedelement das Attribut xmlns
an, wie in den Beispielen unter Protokollgrundlagen gezeigt. Daher wird in den Beispielen dieses Dokuments nicht explizit atom:
für Elemente in einem Atom-Format-Feed angegeben.
Die folgenden Tabellen zeigen die Atom-Darstellung der Elemente des Schemas. Alle Daten, die in diesen Tabellen nicht genannt sind, werden als einfacher XML-Code behandelt. Sofern nicht anders angegeben, befinden sich die XML-Elemente in einer bestimmten Spalte im Atom-Namespace.
Hinweis: In dieser Zusammenfassung wird die Standard-XPath-Notation verwendet, insbesondere Schrägstriche, die die Elementhierarchie zeigen und ein @-Zeichen ein Attribut eines Elements angibt.
In jeder der folgenden Tabellen sind die markierten Elemente erforderlich.
In der folgenden Tabelle sehen Sie die Elemente eines Google Data Protocol-Feeds:
Feedelementschema-Element | Atom-Darstellung |
---|---|
Feedtitel | /feed/title |
Feed-ID | /feed/id |
Feed-HTML-Link | /feed/link[@rel="alternate"] \[@type="text/html"]/@href |
Feedbeschreibung | /feed/subtitle |
Feedsprache | /feed/@xml:lang |
Feed-Urheberrecht | /feed/rights |
Feedautor |
(In bestimmten Fällen erforderlich, siehe Atom-Spezifikation.) |
Datum der letzten Aktualisierung des Feeds | /feed/updated (RFC 3339-Format) |
Feedkategorie | /feed/category/@term |
Schema der Feedkategorie | /feed/category/@scheme |
Feed-Generator | /feed/generator /feed/generator/@uri |
Feedsymbol | /feed/icon |
Feed-Logo | /feed/logo |
Die folgende Tabelle zeigt die Elemente eines Google Data Protocol-Suchergebnisses. Beachten Sie, dass das Protokoll einige der OpenSearch 1.1-Antwortelemente in Suchergebnisfeeds anzeigt.
Schemaelement für Suchergebnisfeed | Atom-Darstellung |
---|---|
Anzahl der Suchergebnisse | /feed/openSearch:totalResults |
Startindex der Suchergebnisse | /feed/openSearch:startIndex |
Anzahl der Suchergebnisse pro Seite | /feed/openSearch:itemsPerPage |
Die folgende Tabelle zeigt die Elemente eines Google Data Protocol-Eintrags:
Eintragschemaelement | Atom-Darstellung |
---|---|
Eintrags-ID | /feed/entry/id |
Titel des Eintrags | /feed/entry/title |
Link zur Teilnahme | /feed/entry/link |
Beitragsübersicht |
(In bestimmten Fällen erforderlich, siehe Atom-Spezifikation.) |
Inhalt des Eintrags |
Wenn kein Inhaltselement vorhanden ist, muss der Eintrag mindestens ein |
Beitragsautor |
(In bestimmten Fällen erforderlich, siehe Atom-Spezifikation.) |
Eintragskategorie | /feed/entry/category/@term |
Schema der Einstiegskategorie | /feed/entry/category/@scheme |
Veröffentlichungsdatum des Beitrags | /feed/entry/published (RFC 3339) |
Aktualisierungsdatum des Eintrags | /feed/entry/updated (RFC 3339) |
Abfragen
In diesem Abschnitt wird die Verwendung des Abfragesystems beschrieben.
Designgrundsätze des Abfragemodells
Das Abfragemodell ist absichtlich sehr einfach gehalten. Die Grundsätze sind:
- Abfragen werden als HTTP-URIs und nicht als HTTP-Header oder als Teil der Nutzlast ausgedrückt. Ein Vorteil dieses Ansatzes besteht darin, dass Sie eine Verknüpfung zu einer Abfrage herstellen können.
- Prädikate werden auf ein einzelnes Element beschränkt. Daher gibt es keine Möglichkeit, eine Korrelationsabfrage wie „Alle E-Mails von Nutzern suchen, die mir heute mindestens 10 E-Mails gesendet haben“ zu senden.
- Die Gruppe von Eigenschaften, auf die sich Suchanfragen prädizieren können, ist sehr begrenzt. Die meisten Abfragen sind einfach Volltextsuchanfragen.
- Die Ergebnisreihenfolge hängt von der Implementierung ab.
- Das Protokoll ist natürlich erweiterbar. Wenn Sie in Ihrem Dienst zusätzliche Prädikate oder Sortierungen bereitstellen möchten, können Sie dies durch die Einführung neuer Parameter ganz einfach tun.
Abfrageanfragen
Ein Client fragt einen Google-Dienst ab, indem er eine HTTP-GET
-Anfrage ausgibt. Der Abfrage-URI besteht aus dem URI der Ressource (in Atom FeedURI genannt), gefolgt von Suchparametern. Die meisten Suchparameter werden als herkömmliche ?name=value[&...]
-URL-Parameter dargestellt. Kategorieparameter werden anders behandelt (siehe unten).
Wenn der FeedURI beispielsweise http://www.example.com/feeds/jo
lautet, können Sie eine Abfrage mit dem folgenden URI senden:
http://www.example.com/feeds/jo?q=Darcy&updated-min=2005-04-19T15:30:00Z
Das Google Data-Protokoll unterstützt die bedingte HTTP-Anfrage GET
. APIs, die das Protokoll implementieren, legen den Antwortheader „Last-Modified“ anhand des Werts des <atom:updated>
-Elements im zurückgegebenen Feed oder Eintrag fest. Ein Client kann diesen Wert als Wert des Anfrageheaders „If-Modified-Since“ zurücksenden, um zu vermeiden, dass der Inhalt noch einmal abgerufen wird, wenn er sich nicht geändert hat. Wenn sich der Inhalt seit dem Zeitpunkt „If-Modified-Since“ nicht geändert hat, gibt der Dienst die HTTP-Antwort „304 (Nicht geändert)“ zurück.
APIs, die das Google-Datenprotokoll implementieren, müssen alt
-Abfragen unterstützen. Die Unterstützung für andere Parameter ist optional. Das Übergeben eines Standardparameters, der von einem bestimmten Dienst nicht verstanden wird, führt zu einer 403 Forbidden
-Antwort. Das Übergeben eines nicht unterstützten nicht standardmäßigen Parameters führt zu einer 400 Bad Request
-Antwort. Informationen zu anderen Statuscodes finden Sie im Abschnitt HTTP-Statuscodes in diesem Dokument.
Die Standardabfrageparameter sind in der folgenden Tabelle zusammengefasst. Alle Parameterwerte müssen URL-codiert sein.
Parameter | Bedeutung | Hinweise |
---|---|---|
alt |
Alternativer Darstellungstyp |
|
author |
Beitragsautor |
|
category |
Kategorieabfragefilter |
|
/-/category |
Kategorieabfragefilter |
|
entryID | ID eines bestimmten abzurufenden Eintrags |
|
fields |
Antwortfilter |
|
max-results |
Maximale Anzahl der abzurufenden Ergebnisse | Für jeden Dienst mit dem Standardwert max-results (zur Beschränkung der Standardgröße des Feeds) können Sie eine sehr große Zahl angeben, um den gesamten Feed zu erhalten. |
prettyprint |
Gibt eine XML-Antwort mit Kennzeichnungen und Zeilenumbrüchen zurück |
|
published-min , published-max |
Grenze am Veröffentlichungsdatum des Eintrags |
|
q |
Volltext-Abfragestring |
|
start-index |
1-basierter Index des ersten abzurufenden Ergebnisses |
|
strict |
Strenge Abfrageparameterprüfung |
|
updated-min , updated-max |
Grenzwerte für das Eintragsaktualisierungsdatum |
|
Kategorieabfragen
Wir haben beschlossen, ein etwas ungewöhnliches Format für Kategorieabfragen bereitzustellen. Anstatt eine Abfrage wie die folgende zu verlangen:
http://example.com/jo?category=Fritz&category=2006
haben wir Folgendes eingeführt:
http://example.com/jo/-/Fritz/2006
Dieser Ansatz identifiziert eine Ressource ohne die Verwendung von Abfrageparametern und erzeugt sauberere URIs. Wir haben uns für Kategorien entschieden, weil wir der Meinung sind, dass Kategorieabfragen zu den häufigsten Suchanfragen gehören.
Der Nachteil dieses Ansatzes ist, dass Sie bei dieser Art von Kategorieabfragen /-/
verwenden müssen, damit Dienste Kategorieabfragen von anderen Ressourcen-URIs wie http://example.com/jo/MyPost/comments
unterscheiden können.
Abfrageantworten
Abfragen geben je nach Anfrageparameter einen Atom-Feed, einen Atom-Eintrag oder einen RSS-Feed zurück.
Abfrageergebnisse enthalten die folgenden OpenSearch-Elemente direkt unter dem <feed>
- oder <channel>
-Element (je nachdem, ob die Ergebnisse Atom oder RSS sind):
openSearch:totalResults
- Die Gesamtzahl der Suchergebnisse für die Suchanfrage (nicht unbedingt alle im Ergebnisfeed).
openSearch:startIndex
- Der 1-basierte Index des ersten Ergebnisses.
openSearch:itemsPerPage
- Die maximale Anzahl von Elementen, die auf einer Seite angezeigt werden. Dadurch können Kunden direkte Links zu beliebigen anderen Seiten generieren. Eine mögliche Störung bei der Verwendung dieser Zahl können Sie dem Hinweis zu
start-index
in der Tabelle im Abschnitt Abfrageanfragen entnehmen.
Der Atom-Antwortfeed und die Einträge können auch eines der folgenden Atom- und Data API-Elemente enthalten (sowie weitere, die in der Atom-Spezifikation aufgeführt sind):
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="..."/>
- Gibt den URI an, unter dem der vollständige Atom-Feed abgerufen werden kann.
<link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="..."/>
- Gibt den PostURI des Atom-Feeds an, über den neue Einträge gepostet werden können.
<link rel="self" type="..." href="..."/>
- Enthält den URI dieser Ressource. Der Wert des Attributs
type
hängt vom angefragten Format ab. Wenn sich in der Zwischenzeit keine Daten ändern, wird beim Senden einer weiteren GET-Anfrage an diesen URI dieselbe Antwort zurückgegeben. <link rel="previous" type="application/atom+xml" href="..."/>
- Gibt den URI des vorherigen Teils dieses Abfrageergebnissatzes an, wenn er aufgeteilt wird.
<link rel="next" type="application/atom+xml" href="..."/>
- Gibt den URI des nächsten Teils dieses Abfrageergebnissatzes an, wenn er aufgeteilt wird.
<link rel="edit" type="application/atom+xml" href="..."/>
- Gibt den EditURI des Atom-Eintrags an, über den Sie einen aktualisierten Eintrag senden.
Hier ist ein Beispiel für einen Antworttext als Antwort auf eine Suchanfrage:
<?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>
Wenn der angeforderte Feed im Atom-Format vorliegt, keine Suchparameter angegeben hat und das Ergebnis nicht alle Einträge enthält, wird das folgende Element in den Feed der obersten Ebene eingefügt: <link rel="next" type="application/atom+xml" href="..."/>
. Sie verweist auf einen Feed mit den nächsten Einträgen. Die nachfolgenden Sätze enthalten ein entsprechendes <link rel="previous" type="application/atom+xml" href="..."/>
-Element. Durch Aufrufen aller nächsten Links kann ein Client alle Einträge aus einem Feed abrufen.
HTTP-Statuscodes
In der folgenden Tabelle wird beschrieben, was verschiedene HTTP-Statuscodes im Kontext der Daten-APIs bedeuten.
Code | Erklärung |
---|---|
200 OK | Kein Fehler |
201 – ERSTELLT | Eine Ressource wurde erstellt. |
304 NICHT GEÄNDERT | Die Ressource hat sich seit der im Header "If-Modified-Since" angegebenen Anfrage nicht geändert. |
400 FEHLERANFRAGE | Ungültiger Anfrage-URI oder -Header oder nicht unterstützter nicht standardgemäßer Parameter. |
401 NICHT AUTORISIERT | Genehmigung erforderlich. |
403 VERBOTEN | Nicht unterstützter Standardparameter oder Authentifizierung oder Autorisierung fehlgeschlagen. |
404 NICHT GEFUNDEN | Ressource (z. B. Feed oder Eintrag) nicht gefunden. |
KONFLIKT 409 | Die angegebene Versionsnummer stimmt nicht mit der neuesten Versionsnummer der Ressource überein. |
410 GELÖSCHT | Der angeforderte Änderungsverlauf ist nicht mehr auf dem Server verfügbar. Weitere Informationen finden Sie in der dienstspezifischen Dokumentation. |
500 INTERNER SERVERFEHLER | Interner Fehler. Dies ist der Standardcode, der für alle unbekannten Serverfehler verwendet wird. |
Ressourcenversionsverwaltung (ETags)
Manchmal müssen Sie auf eine bestimmte Version eines bestimmten Eintrags verweisen.
Das ist insbesondere in zwei Fällen wichtig:
- einen bedingten Abruf durchführen, bei dem Ihr Client einen Eintrag anfordert und der Server den Eintrag nur dann sendet, wenn er sich seit der letzten Anforderung durch den Client geändert hat.
- Sicherstellen, dass nicht versehentlich mehrere Änderungen von anderen Clients überschrieben werden Die Daten-APIs tun dies, indem Aktualisierungen und Löschungen fehlschlagen, wenn der Client eine alte Versionskennung für den Eintrag angibt.
In den beiden Google Data APIs werden diese beiden Fälle mit ETags, einem Standardteil von HTTP, verarbeitet.
Ein ETag ist eine Kennung, die eine bestimmte Version eines bestimmten Eintrags angibt. Der Server hängt ein ETag an Eingabe- und Feed-Elemente an, die es an Kunden sendet. Wenn sich ein Eintrag oder Feed ändert, ändert sich auch das ETag.
Die Google Data APIs bieten ETags an zwei Stellen: in einem ETag
-HTTP-Header und in einem gd:etag
-Attribut von <feed>
- und <entry>
-Elementen.
In den Google Data APIs ist ein ETag normalerweise ein String aus Buchstaben und Ziffern, manchmal auch Bindestriche und Punkte. Der String ist normalerweise in Anführungszeichen eingeschlossen. Die Anführungszeichen gehören zum ETag. Hier ist ein ETag von einem Data API-Eintrag: "S0wCTlpIIip7ImA0X0QI"
.
Es gibt zwei Arten von ETags: stark und schwach. Starke ETags kennzeichnen eine bestimmte Version eines bestimmten Eintrags und können verwendet werden, um zu verhindern, dass Änderungen anderer Clients überschrieben werden. Schwache ETags im Kontext der Google Data APIs werden nur zum bedingten Abruf verwendet. Ein schwaches ETag beginnt immer mit W/
. Beispiel: W/"D08FQn8-eil7ImA9WxZbFEw."
Nicht alle Google Data APIs unterstützen starke ETags. Bei solchen Tags werden starke ETags nur für Einträge verwendet, ETags in Feeds sind immer schwach.
Hier ein Beispiel für einen Feed (einschließlich einiger HTTP-Header), der von einem Dienst abgerufen wird, der starke ETags unterstützt:
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>
Clientbibliotheken, die Version 2 der Data APIs unterstützen, verarbeiten ETags transparent für Sie. Die folgenden Informationen richten sich an Clients, die keine Clientbibliotheken verwenden, und an Leser, die an der Versionsverwaltung auf Protokollebene interessiert sind.
Hinweis: Informationen zum System für die Ressourcenversionsverwaltung in Version 1.0 der Data APIs finden Sie im Referenzhandbuch zu Version 1.0.
Bedingtes Abrufen
Wenn Sie einen bereits abgerufenen Eintrag abrufen möchten, können Sie die Effizienz verbessern, indem Sie den Server anweisen, den Eintrag nur dann zu senden, wenn er sich seit dem letzten Abruf geändert hat.
Senden Sie für diesen bedingten Abruf eine HTTP-GET
-Anfrage mit einem HTTP-If-None-Match
-Header. Geben Sie in der Kopfzeile das ETag des Eintrags an.
Hier ein Beispiel für einen If-None-Match
-Header:
If-None-Match: W/"D08FQn8-eil7ImA9WxZbFEw."
Wenn der Server diese Anfrage empfängt, prüft er, ob der von Ihnen angeforderte Eintrag dasselbe ETag wie das von Ihnen angegebene ETag hat. Wenn die ETags übereinstimmen, bleibt der Eintrag unverändert und der Server gibt den HTTP 304-Statuscode Not Modified
zurück.
Wenn die ETags nicht übereinstimmen, wurde der Eintrag seit Ihrer letzten Anforderung geändert und der Server gibt den Eintrag zurück.
Einträge aktualisieren
Die einfachste Methode, um das Überschreiben der Änderungen eines anderen Clients zu vermeiden, besteht darin, dass die Version des Eintrags, mit der Ihr Client begonnen hat, der Version entspricht, die vom Server gespeichert wurde. Wenn ein zweiter Client eine Aktualisierung vor seinem Client vornimmt, wird die Aktualisierung des Clients abgelehnt, da die Änderungen nicht mehr auf der neuesten Version basieren.
Wenn Ihr Client Daten von einem Dienst abruft, der starke ETags unterstützt, verfügt jeder Eintrag über ein ETag, das als eindeutige Versions-ID für diese Version des Eintrags fungiert.
Hinweis: Die Aktualisierung mit ETags funktioniert nur bei starken ETags. Bei Diensten mit schwachen ETags sind alle Aktualisierungen erfolgreich, unabhängig davon, ob eine andere Person den Eintrag seit dem Abrufen aktualisiert hat. Mit dem neuesten Update werden immer alle vorherigen Updates überschrieben. Senden Sie schwache ETags also beim Aktualisieren oder Löschen nicht. In diesem Fall erhalten Sie eine Fehlermeldung.
Wenn Ihr Client also ein Update an einen strong-ETags-Dienst sendet, muss er angeben, welche Version des Eintrags aktualisiert wird. Dafür gibt es zwei Möglichkeiten:
- Verwenden Sie einen
If-Match
-HTTP-Header. - Verwende das Attribut
gd:etag
im Element<atom:entry>
.
Wir empfehlen, nach Möglichkeit If-Match
.
Wenn Sie einen Eintrag mit If-Match
aktualisieren möchten, müssen Sie zuerst den entsprechenden Eintrag übernehmen. Nehmen Sie die gewünschten Änderungen am Eintrag vor und erstellen Sie dann eine neue PUT
-Anfrage mit dem geänderten Eintrag. Details zu den zu verwendenden URLs finden Sie in der dienstspezifischen Dokumentation.
Fügen Sie vor dem Senden von PUT
einen HTTP-If-Match
-Header mit dem ETag aus dem ursprünglichen Eintrag hinzu:
If-Match: "S0wCTlpIIip7ImA0X0QI"
Senden Sie dann die PUT
-Anfrage.
Wenn die Aktualisierung erfolgreich ist, gibt der Server den HTTP-Statuscode 200 OK
und eine Kopie des aktualisierten Eintrags zurück.
Wenn die Aktualisierung fehlschlägt, weil das von Ihnen angegebene ETag nicht mit dem aktuellen ETag im Eintrag übereinstimmt (was bedeutet, dass sich der Eintrag auf dem Server seit dem letzten Abruf geändert hat), gibt der Server den HTTP-Statuscode 412 Precondition Failed
zurück.
Wenn Sie HTTP-Header nicht einfach schreiben können oder keinen anderen Grund dafür haben, den Header If-Match
zu verwenden, können Sie stattdessen das Attribut gd:etag
verwenden.
Wenn Sie keinen If-Match
-Header senden, verwendet der Server den gd:etag
-Attributwert des aktualisierten Eintrags als impliziten If-Match
-Wert.
Wenn Sie das Versionsverwaltungssystem überschreiben und den Eintrag aktualisieren möchten, unabhängig davon, ob er seit dem Abrufen von einer anderen Person aktualisiert wurde, verwenden Sie If-Match: *
, anstatt das ETag im Header anzugeben.
Informationen dazu, welche Dienste starke ETags unterstützen, finden Sie im Migrationsleitfaden.
Einträge löschen
Das Löschen von Einträgen mit starken ETags funktioniert ähnlich wie das Aktualisieren.
Wenn Sie einen Eintrag mit einem starken ETag löschen möchten, rufen Sie zuerst den zu löschenden Eintrag ab und senden Sie dann eine DELETE
-Anfrage an die Bearbeitungs-URL des Eintrags.
Wenn Sie sichergehen möchten, dass Sie keinen Eintrag löschen, der seit dem Abrufen durch einen anderen Client geändert wurde, fügen Sie einen HTTP-If-Match
-Header ein, der den ETag-Wert des ursprünglichen Eintrags enthält.
Wenn Sie das Versionsverwaltungssystem überschreiben und den Eintrag löschen möchten, unabhängig davon, ob er seit dem Abrufen von einer anderen Person aktualisiert wurde, verwenden Sie If-Match: *
, anstatt das ETag im Header anzugeben.
Wenn ein Eintrag kein starkes ETag hat, ist eine DELETE
-Anfrage immer erfolgreich.
Teilantwort (experimentell)
Standardmäßig sendet der Server nach der Verarbeitung von Anfragen die vollständige Darstellung der Zielressource zurück. Bei der Teilantwort können Sie nur die gewünschten Elemente oder Attribute anstelle der vollständigen Ressourcendarstellung anfordern. Dadurch kann Ihre Clientanwendung das Übertragen, Parsen und Speichern nicht benötigter Felder vermeiden und so Netzwerk-, CPU- und Speicherressourcen effizienter nutzen.
Informationen dazu, ob eine Teilantwort für das von Ihnen verwendete Produkt verfügbar ist, finden Sie in der zugehörigen API-Dokumentation.
Wenn Sie eine Teilantwort anfordern möchten, verwenden Sie den Abfrageparameter fields
, um die Elemente oder Attribute anzugeben, die zurückgegeben werden sollen. Hier ein Beispiel:
http://www.example.com/feeds?fields=link,entry(@gd:etag,id,updated,link[@rel='edit']))
Die Antwort des Servers enthält nur Link- und Eintragselemente für den Feed. Die Eingabeelemente enthalten nur ETag-, ID-, aktualisierte und bearbeitete Linkinformationen. Die Syntax des Abfrageparameters fields
wird in den folgenden Abschnitten behandelt. Weitere Informationen zur Antwort finden Sie unter Teilantworten verarbeiten.
Hinweis: Sie können den Abfrageparameter fields
für jede Anfrage verwenden, die Daten zurückgibt. Zusätzlich zu GET
umfasst dies POST
und PUT
(sowie PATCH
, die für Teilaktualisierungen verwendet wird). Der Abfrageparameter fields
wirkt sich jedoch nur auf die Antwortdaten aus. Er hat keine Auswirkungen auf die Daten, die Sie angeben müssen oder die aktualisiert oder erstellt werden.
Parameter "Fields" – Syntaxzusammenfassung
Das Format des Suchparameterwerts fields
basiert auf der XPath-Syntax, unterstützt jedoch nur einen Teil der gültigen XPath-Ausdrücke. Die unterstützte Syntax wird unten zusammengefasst. Zusätzliche Beispiele finden Sie im darauffolgenden Abschnitt.
- Verwenden Sie eine durch Kommas getrennte Liste, um mehrere Felder auszuwählen.
- Verwenden Sie
a/b
, um ein Elementb
auszuwählen, das im Elementa
verschachtelt ist. Verwenden Siea/b/c
, um ein Elementc
auszuwählen, das inb
verschachtelt ist. - Verwenden Sie das Präfix
'@'
, um ein Attribut mit dem angegebenen Namen zu identifizieren. Lassen Sie das Präfix'@'
weg, um auf ein Element zu verweisen. - Sie können Feldbedingungen anwenden, um Elemente auszuwählen, die bestimmten Kriterien entsprechen. Fügen Sie dazu Ausdrücke in Klammern „
[ ]
“ hinter dem Element ein, das Sie einschränken möchten.Beispielsweise gibt
fields=entry[author/name='Elizabeth']
nur Feedeinträge zurück, für die Elisabeth die Autorin ist. - Geben Sie ein Feld-Unterselektor an, um nur bestimmte Attribute oder Unterelemente anzufordern, indem Sie Ausdrücke nach jedem ausgewählten Element in Klammern "
( )
" setzen.Beispielsweise gibt
fields=entry(id,author/email)
für jeden Feedeintrag nur die ID und die E-Mail-Adresse des Autors zurück. - Sie können Strings entweder mit doppelten oder einfachen Anführungszeichen trennen
.
Um ein doppeltes oder einfaches Anführungszeichen zu maskieren, wiederholen Sie das Anführungszeichen. Beispielsweise generiert
"""Hello,"" he said"
den String"Hello," he said
und'''Hello,'' he said'
den String'Hello,' he said
. - Sie können bei der Feldauswahl Platzhalter verwenden.
Mit
entry/gd:*
werden beispielsweise alle untergeordneten Elemente des Eintrags im Namespacegd
ausgewählt und mitentry/@gd:*
werden die Attribute der untergeordneten Elemente im selben Namespace ausgewählt.
Der Abfrageparameter fields
dient als Ausgabefilter. Das bedeutet, dass die Teilantwort erst nach der Verarbeitung der restlichen Abfrage berechnet wird. Wenn Sie beispielsweise einen max-results
-Abfrageparameter angeben, um anzugeben, dass Sie 20 Ergebnisse pro Seite wünschen, werden die ersten 20 Ergebnisse generiert und die Teilantwort daraus berechnet. Wenn die fields
-Spezifikation mit keinem der ersten 20 Einträge übereinstimmt, die durch die Abfrage ausgewählt wurden, wird ein leerer Feed zurückgegeben. Die ersten 20 passenden Einträge werden nicht zurückgegeben.
Hinweis: Versuchen Sie nicht, Feldbedingungen als Abfrageauswahl zu verwenden. Versuchen Sie also nicht, einen vollständigen Feed abzurufen und Feldbedingungen anzuwenden, um relevante Elemente aus einem sehr großen Datensatz herauszufiltern. Verwenden Sie nach Möglichkeit andere Suchparameter wie start-index
und max-results
, um die Ergebnisse der einzelnen Abfragen auf eine überschaubare Größe zu reduzieren. Andernfalls kann die Leistungssteigerung, die durch die teilweise Reaktion möglich ist, durch die schwerwiegende Leistungseinnahme aufgewogen werden, die durch eine unsachgemäße Verwendung verursacht wird.
Feldparameter formatieren
In den folgenden Richtlinien wird erläutert, wie Sie den Wert des Abfrageparameters fields
erstellen. Jede Richtlinie enthält Beispiele und beschreibt, wie sich der Parameterwert auf die Antwort auswirkt.
Hinweis: Wie bei allen Abfrageparameterwerten muss der Wert des Parameters fields
URL-codiert sein. In den folgenden Beispielen wird die Codierung weggelassen, um die Lesbarkeit zu verbessern.
- Identifizieren Sie die Felder, die zurückgegeben werden sollen, oder treffen Sie eine Feldauswahl.
- Der Wert des Abfrageparameters
fields
ist eine durch Kommas getrennte Liste von Elementen oder Attributen (gemeinsam als Felder bezeichnet). Jedes Feld wird relativ zum Stammelement der Ressourcendarstellung angegeben. Wenn Sie einen Feed abrufen, werden die Felder im Verhältnis zum Element<feed>
angegeben. Wenn Sie einen einzelnen Eintrag abrufen, werden die Felder im Verhältnis zum Element<entry>
angegeben. Wenn das ausgewählte Element ein wiederkehrendes Element im Feed ist oder zu diesem gehört, gibt der Dienst alle Instanzen dieses Elements zurück.
Hier einige Beispiele für Feeds:
Beispiele Auswirkung entry
Gibt alle <entry>
-Elemente und alle Unterelemente dieser Einträge zurück, aber keine anderen untergeordneten Elemente von<feed>
.id,entry
Gibt sowohl den Feed- <id>
als auch alle<entry>
-Elemente zurück.entry/title
Gibt das <title>
-Element für alle Feedeinträge zurück.
Wenn ein verschachteltes Element zurückgegeben wird, enthält die Antwort einschließende Tags für alle übergeordneten-Elemente. Die übergeordneten Tags enthalten nur dann andere untergeordnete Elemente oder Attribute, wenn sie explizit ausgewählt wurden.
entry/author/uri
Gibt nur das Unterelement <uri>
des Elements<author>
für alle Feedeinträge zurück.entry/*:rating
Gibt für alle Feedeinträge nur Unterelemente mit lokalem Namen rating
in einem Namespace zurück.
Hier einige Beispiele für Einsteiger:
Beispiele Auswirkung author
Gibt das untergeordnete <author>
-Element des Zieleintrags zurück.@gd:etag
Gibt das Attribut etag
des Zieleintrags zurück.author/uri
Gibt das <uri>
-Unterelement des<author>
-Elements für den Zieleintrag zurück.media:group/media:*
Gibt alle untergeordneten Felder von <media:group>
im Namespacemedia
für den Zieleintrag zurück. - Beschränken Sie die Antwort auf ausgewählte Felder, die bestimmte Kriterien erfüllen, oder verwenden Sie Feldbedingungen.
- Wenn in Ihrer Anfrage ein Element angegeben ist, das mehrmals vorkommt, enthält die Teilantwort standardmäßig alle Instanzen dieses Elements. Sie können auch festlegen, dass die Antwort nur Elemente mit einem bestimmten Attributwert oder Elemente mit einer anderen Bedingung mit der Syntax „
[ ]
“ enthalten soll, wie in den folgenden Beispielen gezeigt. Weitere Informationen finden Sie im Abschnitt Feldbedingungssyntax.Beispiele Auswirkung entry[link/@rel='edit']
Gibt alle Feedeinträge zurück, die ein <link>
-Element mit einemrel
-Attributwert von'edit'
enthalten.entry/title[text()='Today']
Gibt alle <title>
-Elemente zurück, die in Feedeinträgen vorkommen, wenn ihr Inhalt'Today'
ist.entry/author[name='Jo']
Gibt alle <author>
-Elemente zurück, die in Feedeinträgen vorkommen, wenn sie ein<name>
-Unterelement mit dem Inhalt'Jo'
haben.author[name='Jo']
Gibt das <author>
-Element im Zieleintrag zurück, wenn es ein<name>
-Unterelement mit dem Inhalt'Jo'
enthält. - Fordern Sie nur Teile der ausgewählten Elemente an oder verwenden Sie eine Feldunterauswahl.
- Wenn in Ihrer Anfrage bestimmte Elemente angegeben sind, gibt der Dienst die Elemente standardmäßig vollständig zurück. Sie können festlegen, dass die Antwort nur bestimmte Unterelemente in den ausgewählten Elementen enthalten soll. Dazu verwenden Sie die Syntax „
( )
“ für die untergeordnete Auswahl wie in den folgenden Beispielen dargestellt.Beispiele Auswirkung entry/author(uri)
Gibt nur das Unterelement <uri>
für Autoren in Feedeinträgen zurück.entry/author[name='Jo'](uri)
Gibt nur das <uri>
-Unterelement<author>
für Einträge mit dem Autorennamen'Jo'
zurück.entry(link(@rel,
@href))
Gibt nur die Werte der Attribute rel
undhref
für jedes<link>
-Element in Feedeinträgen zurück.entry(title,link[@rel='edit'])
Gibt nur <title>
- und<link>
-Elemente mitrel
-Attributen zum Bearbeiten für jeden Feedeintrag zurück.entry(title,author(uri)
Gibt sowohl <title>
-Elemente als auch Autor-<uri>
-Elemente für jeden Feedeintrag zurück.
Weitere Informationen zur Syntax von Feldbedingungen
Sie können Feldbedingungen mit Feldern oder untergeordneten Feldern verwenden. Die Bedingung muss als „true“ ausgewertet werden, damit das ausgewählte Feld in die Ergebnisse aufgenommen wird.Wenn keine Feldbedingung vorhanden ist, werden alle Felder des ausgewählten Typs eingeschlossen.
Der Textwert des ausgewählten Feldes wird für Vergleiche verwendet. Wenn es sich bei dem Feld um ein Element handelt, entspricht der Textwert seinem Inhalt. Wenn das Feld ein Attribut ist, ist der Textwert der Attributwert. Wenn das Feld keinen Textwert hat, schlägt der Vergleich fehl und das Feld ist nicht in den Ergebnissen enthalten.
Die folgende Tabelle enthält die XPath-Operatoren, die für Feldbedingungen unterstützt werden, sowie einige Beispiele.
Betreiber | Syntax | Beispiele |
---|---|---|
Stringvergleich |
|
|
Logischer Vergleich | and |
|
Numerischer Vergleich | = oder eq != oder ne > oder gt > = oder ge < oder lt <= oder le
|
|
Zeitraumvergleich | Verwenden Sie numerische Vergleichsoperatoren wie in den Beispielen gezeigt. | Für den Vergleich von Datum und Uhrzeit können Sie Elemente, Attribute oder Stringliterale in
|
Vorhanden | Verwenden Sie den Namen des Elements oder Attributs, wie in den Beispielen gezeigt. |
|
Boolesch | true() false()
|
Boolesche Werte können beim Testen nützlich sein, um Feldbedingungen in den Status „wahr“ oder „falsch“ zu erzwingen.
|
Umgang mit Teilantworten
Nachdem ein Server, der eine Teilantwort unterstützt, eine gültige Anfrage verarbeitet, die den Abfrageparameter fields
enthält, sendet er einen HTTP-Statuscode 200 OK
zusammen mit den angeforderten Attributen oder Elementen zurück. Wenn der Abfrageparameter fields
einen Fehler enthält oder ungültig ist, gibt der Server den HTTP-Statuscode 400 Bad Request
zurück.
Das Stammelement der Antwort ist je nach Ziel-URI entweder <feed>
oder <entry>
. Der Inhalt des Stammelements enthält nur die ausgewählten Felder für diesen Feed oder Eintrag sowie die umschließenden Tags für die übergeordneten Elemente.
Der Wert des fields
-Abfrageparameters der Anfrage kann auf zwei Arten wiederholt werden:
- Das Stammelement hat ein Attribut
gd:fields
, das den Wert des in der Anfrage angegebenen Abfrageparametersfields
angibt. - Wenn der Ziel-URI ein Feed ist, hat jeder bearbeitbare Eintrag ein
gd:fields
-Attribut, das den entsprechenden Abschnitt derfields
-Auswahl angibt.
Hinweis: Damit die gd:fields
-Attributwerte in der Teilantwort erscheinen, müssen Sie sie der Spezifikation des fields
-Abfrageparameters hinzufügen. Dazu können Sie @gd:fields
verwenden oder den allgemeinen @gd:*
verwenden, der auch ETag-Informationen enthält.
Mit der folgenden Beispielabfrage wird vom Server ein Dokument zurückgegeben, das nur Attribute im Namespace gd
(sowohl auf Feed- als auch auf Eintragsebene) sowie die Feed-ID, den Titel und den Bearbeitungslink für jeden Feedeintrag enthält:
http://example.com/myFeed?fields=@gd:*,id,entry(@gd:*,title,link[@rel='edit'])
Der Server gibt die folgende Teilantwort zusammen mit einem 200 Successful
-HTTP-Statuscode zurück:
<?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>
Wenn die ausgewählten Felder nichts zurückgeben, gibt der Dienst zwar den HTTP-Statuscode 200 Successful
zurück, aber die Teilantwort ist ein leerer Feed:
<?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>
Teilweise Aktualisierung (experimentell)
Bei Google-Produkten, die eine teilweise Antwort und bearbeitbare Ressourcen unterstützen, können Sie auch eine Teilaktualisierung verwenden. Bei der Teilaktualisierung senden Sie nur die Felder, die Sie aktualisieren möchten, nicht eine geänderte Version der vollständigen Ressourcendarstellung. Dadurch kann die Clientanwendung bei Aktualisierungen sowie bei Verwendung der Teilantwort zum Abrufen von Daten effizienter sein.
Bei einer teilweisen Aktualisierung müssen Sie anstelle von PUT
jedoch eine PATCH
-Anfrage verwenden. Die Semantik für PATCH
ist so leistungsstark, dass Sie mit nur einer Anfrage bestimmte Felder für einen bestimmten Eintrag hinzufügen, ersetzen und löschen können.
Informationen dazu, ob ein teilweises Update für das von Ihnen verwendete Produkt verfügbar ist, finden Sie in der produktspezifischen Dokumentation.
Teilweise Aktualisierungsanfrage senden
Zum Senden einer partiellen Aktualisierungsanfrage senden Sie eine HTTP-PATCH
-Anfrage an dieselbe URL, die Sie normalerweise mit PUT
zum Aktualisieren der Ressource verwenden würden. Der Text der PATCH
-Anfrage ist ein partielles <entry>
-Element, das die Felder angibt, die Sie hinzufügen oder ändern möchten. Das Attribut gd:fields
des Eintrags gibt die Felder an, die Sie löschen möchten.
Der Server verarbeitet PATCH
-Anfragen in einer bestimmten Reihenfolge:
- Er entfernt zuerst die durch das Attribut
gd:fields
angegebenen Felder aus der Ressourcendarstellung.Die Syntax des Attributs
gd:fields
entspricht der Syntax für den Abfrageparameterfields
, der für die Anforderung einer Teilantwort verwendet wird. Weitere Informationen finden Sie unter Unterstützte Syntax. - Anschließend werden die Daten im Text der Anfrage in die vorhandene Ressourcendarstellung zusammengeführt.
Weitere Informationen dazu, wie die Daten zusammengeführt werden, finden Sie unten im Abschnitt Felder hinzufügen oder aktualisieren.
Hinweis: Da der Text einer PATCH
-Anfrage in der Regel nicht mit dem Atom Syndication Format kompatibel ist, verwenden Sie für eine PATCH
-Anfrage den Wert application/xml
.
Hier ein Beispiel für eine Teilaktualisierungsanfrage:
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>
Mit dieser PATCH
-Anfrage werden die folgenden Änderungen an der Ressourcendarstellung vorgenommen, die auf dem Server für den Ziel-URI-Eintrag gespeichert sind:
- Entfernt das Element
<description>
. - Aktualisiert das
<title>
-Element.
Semantik einer Teilaktualisierungsanfrage
In der folgenden Anleitung wird erläutert, wie Sie Ihre PATCH
-Anfrage zum Löschen, Hinzufügen oder Aktualisieren bestimmter Felder innerhalb eines Eintrags einrichten. Mit einer einzelnen PATCH
-Anfrage können diese Vorgänge beliebig kombiniert werden.
Felder löschen. Verwenden Sie das Attribut
gd:fields
des Elements<entry>
, um alle Felder zu identifizieren, die Sie aus der Ressource löschen möchten. Mit der folgenden Beispielanfrage werden der Titel und die Zusammenfassung eines Eintrags gelöscht. Durch die Anfrage werden jedoch keine anderen Daten für den Eintrag hinzugefügt oder aktualisiert.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'/>
Felder hinzufügen oder aktualisieren. Verwenden Sie den Textteil des
<entry>
-Elements, um die Daten anzugeben, die Sie für eine Ressource hinzufügen oder aktualisieren möchten. Nachdem Felder gelöscht wurden, werden diese Felder gemäß den folgenden Regeln mit den vorhandenen Daten für die Ressource zusammengeführt:Felder, die noch nicht vorhanden sind, werden hinzugefügt. Wenn für die Ressourcendaten noch kein Wert für ein Feld angegeben ist, wird das Feld den vorhandenen Daten hinzugefügt. Wenn ein Eintrag beispielsweise keinen Titel hat und Ihre
PATCH
-Anfrage ein<title>
-Element enthält, wird der neue Titel dem Eintrag hinzugefügt.Bereits vorhandene Felder werden ersetzt oder angehängt. Das Verhalten beim Zusammenführen von Feldern, die bereits in den Ressourcendaten angegeben sind, hängt von den Merkmalen des jeweiligen Felds ab:
Nicht wiederkehrende Felder werden ersetzt. Wenn in den Ressourcendaten bereits ein Wert für ein nicht wiederkehrendes Element angegeben ist, ersetzt der in der
PATCH
-Anfrage angegebene Wert den vorhandenen Wert für dieses Element. Im folgenden Beispiel wird der vorhandene Titel durch den neuen ersetzt.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>
Ein komplexeres Beispiel finden Sie unten. In diesem Beispiel wird davon ausgegangen, dass der Eintrag nur einen Autor haben kann und dass die Zielressource bereits Werte für den Namen und die E-Mail-Adresse des Autors hat. Obwohl das
<author>
-Element zwei untergeordnete Felder hat, ist nur das<name>
-Element in den bereitgestellten Daten vorhanden. Daher wird nur der Wert dieses Felds überschrieben. Der Wert des<email>
-Elements, der in den bereitgestellten Daten fehlt, bleibt unverändert.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>
Wiederkehrende Felder werden angehängt. Wenn in den Ressourcendaten bereits ein Wert für ein wiederkehrendes Element angegeben ist, wird das neue Element dem vorhandenen Satz von Werten hinzugefügt.
Es kann vorkommen, dass Sie etwas anderes tun möchten, als eine neue Instanz eines wiederkehrenden Elements hinzuzufügen. Sie haben z. B. folgende Möglichkeiten:
Ersetzen Sie eine ganze Liste wiederkehrender Elemente. Sie können alle sich wiederholenden Felder mit dem Attribut
gd:fields
(z. B.gd:fields='ns:accessControl'
) löschen und einen vollständigen Satz der Ersatzfelder angeben. Da alle vorhandenen Elemente zuerst gelöscht werden, stehen die von Ihnen angegebenen Felder nicht in Konflikt mit vorhandenen Werten, wenn sie angehängt werden.Ersetzen Sie einen Wert in einer Gruppe von vorhandenen Werten für ein wiederkehrendes Element. In diesem Fall entfernen Sie das einzelne Element, indem Sie den Wert für
gd:fields
so eng definieren, dass andere Werte, die Sie beibehalten möchten, nicht gelöscht werden. Wenn Sie beispielsweise nur eine Zugriffssteuerung mit einemaction
vonembed
entfernen möchten, können Siegd:fields='ns:accessControl[@action="embed"]'
verwenden. Geben Sie dann im Textkörper des Elements<entry>
das einzelne Feld an, durch das Sie es ersetzen möchten: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>
Reaktion auf eine Teilaktualisierung
Nach der Verarbeitung einer gültigen Anfrage für eine Teilaktualisierung gibt die API den HTTP-Antwortcode 200 OK
zurück. Standardmäßig ist der Text der Antwort der vollständige Eintrag, den Sie aktualisiert haben. Der Server aktualisiert ETag-Werte, wenn er eine PATCH
-Anfrage verarbeitet, genau wie bei PUT
.
Wenn eine PATCH
-Anfrage zu einem neuen Ressourcenstatus führt, der syntaktisch oder semantisch ungültig ist, gibt der Server den HTTP-Statuscode HTTP 400 Bad Request
oder 422 Unprocessable Entity
zurück und der Ressourcenstatus bleibt unverändert. Wenn Sie beispielsweise versuchen, ein Pflichtfeld zu löschen, und keinen Ersatz bereitstellen, gibt der Server einen Fehler zurück.
Hinweis: Es ist wichtig zu verstehen, wie verschiedene Felder miteinander in Beziehung stehen. Es ist möglich, eine Ressource in einen inkonsistenten Zustand zu versetzen, indem nur ein Teil der gegenseitig voneinander abhängigen Werte aktualisiert wird. Es ist beispielsweise möglich, eine Startzeit auf einen späteren Wert als eine Endzeit zu aktualisieren. Obwohl die API einen Fehlercode zurückgeben sollte, empfehlen wir Ihnen, diese Bedingungen vollständig zu testen, um Konsistenz zu gewährleisten.
Alternative Schreibweise, wenn PATCH nicht unterstützt wird
Wenn Ihre Firewall PATCH
nicht unterstützt, führen Sie eine HTTP-POST
-Anfrage aus und setzen Sie den Überschreibungsheader auf PATCH
, wie unten dargestellt:
POST /myfeed/1/1/ X-HTTP-Method-Override: PATCH Content-Type: application/xml ...
Teilantwort mit Teilaktualisierung verwenden
Sie können eine Teilantwort als Grundlage für eine nachfolgende Teilaktualisierungsanfrage verwenden. Geben Sie in diesem Fall einen fields
-Abfrageparameter an, der Bearbeitungslinks enthält, sowie @gd:*
. Dadurch wird sichergestellt, dass die Teilantwort Informationen wie das ETag- und das gd:fields
-Attribut enthält, die für nachfolgende Anfragen wichtig sind.
In diesem Beispiel wird eine Teilantwort zurückgegeben, die Sie als Grundlage für eine zukünftige Teilaktualisierung verwenden können:
http://example.com/myFeed/1/1/?fields=@gd:*,link[@rel='edit'](@href),gd:who
Der Server antwortet:
<?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>
Angenommen, Sie möchten den Nutzer mit der E-Mail-Adresse 'jane@gmail.com'
entfernen, einen Nutzer mit der E-Mail-Adresse 'will@gmail.com'
hinzufügen und die E-Mail-Adresse für den aktuell als 'jo@gmail.com'
aufgeführten Nutzer in 'josy@gmail.com'
ändern.
Sie können diese Änderungen einfach vornehmen, indem Sie mit den Ergebnissen der vorherigen Antwort beginnen, nur die anderen Felder ändern und den geänderten Teileintrag als Text der PATCH
-Anfrage einreichen. In diesem Beispiel sind folgende Änderungen erforderlich:
- Löschen Sie
<gd:who email='jane'/>
aus der Liste der bereitgestellten Elemente. - Fügen Sie
<gd:who email='will@gmail.com'/>
der Liste der bereitgestellten Elemente hinzu. - Ersetzen Sie
<gd:who email='jo@gmail.com'/>
durch<gd:who email='josy@gmail.com'/>
.
Die PATCH
-Anfrage, die auf der abhängigen Teilantwort basiert, ist unten zu sehen:
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>
Hinweis: Bei diesem Ansatz werden die Attribute gd:fields
und gd:etag
(falls unterstützt) in der Teilantwort für den Eintrag verwendet. Der Text des Teileintrags muss alle Felder und Attribute beibehalten, die in der Teilantwort vorhanden waren – mit Ausnahme derjenigen, die Sie explizit entfernen möchten. Sie können alle vorhandenen Felder im Textkörper mit neuen Werten aktualisieren und neue Felder hinzufügen, die Sie hinzufügen möchten.
Authentifizierung
Wenn ein Client versucht, auf einen Dienst zuzugreifen, muss er möglicherweise die Anmeldedaten des Nutzers für den Dienst angeben, um nachzuweisen, dass der Nutzer die Berechtigung hat, die betreffende Aktion auszuführen.
Der Ansatz, den ein Client für die Authentifizierung verwenden soll, hängt vom Clienttyp ab:
- Eine Desktopanwendung sollte ein Google-spezifisches Authentifizierungssystem mit der Bezeichnung Kontoauthentifizierung für installierte Anwendungen (auch bekannt als „ClientLogin“) verwenden. Webbasierte Clients dürfen dieses System nicht verwenden.
- Ein webbasierter Client, z. B. das Front-End eines Drittanbieters für einen Google-Dienst, sollte ein Google-spezifisches Authentifizierungssystem namens Account Authentication Proxy for Web-Application Applications (auch „AuthSub“ genannt) verwenden.
Im ClientLogin-System fragt der Desktop-Client den Nutzer nach seinen Anmeldedaten und sendet diese dann an das Google-Authentifizierungssystem.
Wenn die Authentifizierung erfolgreich ist, gibt das Authentifizierungssystem ein Token zurück, das der Client beim Senden von Data API-Anfragen (in einem HTTP-Autorisierungsheader) verwendet.
Falls die Authentifizierung fehlschlägt, gibt der Server den Statuscode „403 Forbidden“ zusammen mit einem WWW-Authenticate-Header zurück, der eine für die Authentifizierung anwendbare Identitätsbestätigung enthält.
Das AuthSub-System funktioniert ähnlich, mit der Ausnahme, dass der Nutzer nicht nach seinen Anmeldedaten gefragt wird, sondern eine Verbindung zu einem Google-Dienst herstellt, der Anmeldedaten anfordert. Der Dienst gibt dann ein Token zurück, das die Webanwendung verwenden kann. Der Vorteil dieses Ansatzes besteht darin, dass Google (anstatt das Web-Front-End) die Anmeldedaten des Nutzers sicher verarbeitet und speichert.
Weitere Informationen zu diesen Authentifizierungssystemen finden Sie in der Authentifizierungsübersicht der Google Data APIs oder in der Dokumentation zur Google-Kontoauthentifizierung.
Sitzungsstatus
Bei vielen Implementierungen der Geschäftslogik ist eine Sitzungstreue erforderlich. Damit wird der Status der Nutzersitzung erfasst.
Google erfasst den Sitzungsstatus auf zwei Arten: mithilfe von Cookies und mithilfe eines Tokens, das als Suchparameter gesendet werden kann. Beide Methoden erzielen denselben Effekt. Wir empfehlen, dass Clients eine dieser Tracking-Methoden für den Sitzungsstatus unterstützen (eine davon ist ausreichend). Wenn ein Client keine dieser Methoden unterstützt, funktioniert er zwar mit Daten-APIs, die Leistung kann jedoch im Vergleich zu Clients, die diese Methoden unterstützen, beeinträchtigt werden. Wenn ein Client diese Methoden nicht unterstützt, führt jede Anfrage zu einer Weiterleitung, sodass jede Anfrage und alle zugehörigen Daten zweimal an den Server gesendet werden. Dies wirkt sich sowohl auf die Leistung des Clients als auch auf den Server aus.
Die Google-Clientbibliotheken verarbeiten den Sitzungsstatus für Sie. Wenn Sie also unsere Bibliotheken verwenden, müssen Sie nichts unternehmen, um Unterstützung für den Sitzungsstatus zu erhalten.
Weitere Informationen
Die folgenden Dokumente von Drittanbietern sind möglicherweise hilfreich:
- Atom- und RSS-Vergleich im Vergleich
- Übersicht über Atom von IBM
- Dublin Core-Erweiterungen zu RSS
- HTTP 1.1-Methodendefinitionen: Spezifikation für
GET
,POST
,PUT
undDELETE
- HTTP 1.1-Statuscodes
- REST-Protokoll erstellen
- Webdienst für REST erstellen
- Technische Einführung in XML
- XML-Namespaces nach Beispiel
- ETag-Abschnitt der HTTP-Spezifikation