Steeds dezelfde data ophalen die niet veranderd is, is verspilling van bandbreedte, tijd en soms quota. ETags lossen dit elegant op: de API vertelt je of er iets veranderd is voordat je de hele resource downloadt. Voor integraties die vaak dezelfde data raadplegen, levert dit forse winst op. In dit artikel leer je ETags inzetten voor caching en voor veilig schrijven.
Wat een ETag is
Een ETag is een korte vingerafdruk van de huidige versie van een resource. Verandert de resource, dan verandert de ETag.
- De API geeft de ETag mee in de response, vaak in de
ETag-header of in eenetag-veld in de JSON. - Jij bewaart de ETag samen met de gecachte data.
- Bij een volgende call stuur je de ETag mee als voorwaarde.
- De API antwoordt alleen met de volledige data als die veranderd is.
Wat zijn conditionele requests?
Het idee heet conditionele requests. In plaats van te vragen geef mij de data, vraag je geef mij de data alleen als die anders is dan wat ik al heb. Dat bespaart een volledige download wanneer er niets gewijzigd is.
Caching met If-None-Match
Voor efficient lezen gebruik je de If-None-Match-header met je opgeslagen ETag.
Conditioneel lezen met ETags
- Doe een eerste call en bewaar de resource samen met de ETag uit de response.
- Stuur bij de volgende call die ETag mee in de
If-None-Match-header. - Krijg je een 304 Not Modified? Gebruik je gecachte kopie, er is niets veranderd.
- Krijg je een 200 met nieuwe data? Vervang je cache en bewaar de nieuwe ETag.
Een ruw voorbeeld van de tweede call ziet er zo uit:
GET /admin/directory/v1/groups/sales@example.com HTTP/1.1
Host: admin.googleapis.com
Authorization: Bearer ya29...
If-None-Match: "abc123etagwaarde"
Bij een ongewijzigde resource antwoordt de server met 304 Not Modified en een lege body, zodat je je gecachte versie hergebruikt.
304 is bijna gratis
Een 304-respons bevat geen body en is dus heel licht. Voor vaak geraadpleegde maar zelden veranderende data, zoals organisatie-eenheden of groepsinstellingen, bespaart deze aanpak veel dataverkeer en versnelt het je integratie merkbaar.
Veilig schrijven met If-Match
ETags voorkomen ook dat je per ongeluk andermans wijziging overschrijft. Dit heet optimistic concurrency.
Veilig schrijven met If-Match
- Lees de resource en onthoud de ETag.
- Bereid je wijziging voor op basis van die versie.
- Stuur de update met de ETag in de
If-Match-header. - Is de resource ondertussen gewijzigd? Dan weigert de API met een 412 Precondition Failed of een vergelijkbare conflictstatus.
- Herlees de actuele versie en pas je wijziging opnieuw toe op die verse versie.
Forceer een conflict nooit weg
Negeer een conflict-respons nooit door simpelweg te forceren. Een conflict betekent dat iemand anders de resource heeft gewijzigd sinds jij hem las. Forceer je je versie eroverheen, dan wis je hun wijziging. Herlees altijd en voeg je wijziging op de verse versie toe.
Waar ETags wel en niet helpen
| Situatie | Aanpak |
|---|---|
| Je raadpleegt dezelfde, zelden veranderende resource vaak | ETags besparen veel; gebruik If-None-Match. |
| Je verwerkt elke keer compleet nieuwe data | ETags helpen weinig; er valt niets te hergebruiken. |
| Je doet gelijktijdige updates op dezelfde resource | Gebruik If-Match om verlies van wijzigingen te voorkomen. |
Praktische aandachtspunten
- Bewaar de ETag exact, inclusief de aanhalingstekens die de server meestuurt. Strip ze niet, anders matcht je conditionele request niet.
- Niet elke API zet de ETag op dezelfde plek. Sommige Workspace-API's geven hem in de HTTP-
ETag-header, andere in eenetag-veld in de JSON-body. Controleer de documentatie van de specifieke API. - Verloopt een ETag, vernieuw dan je cache. Krijg je een 200 met nieuwe data, dan vervang je zowel de inhoud als de bewaarde ETag.
Ondersteunen alle Workspace-API's ETags?
Veel API's wel, maar niet alle, en de plek waar de ETag staat verschilt per API. Controleer in de documentatie of conditionele requests ondersteund worden en of de ETag in een header of in een JSON-veld staat.
Bespaart een 304 ook quota?
Een 304 bespaart vooral bandbreedte en tijd. Of het ook meetelt voor je quota verschilt per API, maar het is hoe dan ook efficienter dan telkens de volledige resource ophalen.
Hoe lang is een ETag geldig?
Een ETag blijft geldig zolang de resource niet wijzigt. Verandert de resource, dan krijg je vanzelf een nieuwe versie met een nieuwe ETag terug en vervang je je gecachte waarde.
Wat als ik geen ETag bewaar?
Dan val je terug op gewone, onvoorwaardelijke requests die altijd de volledige data ophalen. Dat werkt prima, maar je mist de efficientiewinst van conditionele requests.
Welke statuscode krijg ik bij een schrijfconflict?
Meestal een 412 Precondition Failed wanneer je If-Match-voorwaarde niet meer klopt. Herlees dan de resource, neem de nieuwe ETag over en probeer je wijziging opnieuw.
Moet ik de ETag zelf berekenen?
Nee. De server bepaalt en levert de ETag. Jij bewaart hem alleen en stuurt hem ongewijzigd terug in If-None-Match of If-Match.
Met ETags maak je je integratie zuiniger en veiliger: minder onnodig dataverkeer en bescherming tegen het overschrijven van wijzigingen.