2012-12-05 9 views
5

Nach dem Bearbeiten eines Dokuments in Google Drive scheint sich der LastModified-Wert nicht sofort zu ändern. Es sieht so aus, als ob der Wert in wenigen Minuten aktualisiert wird.Etag und LastModifiedDate ändern sich nicht nach der Dateibearbeitung

Ich habe versucht, das Etag des Dokuments von DriveSDK zu holen, passiert es auch mit dem Etag-Wert.

Dieses seltsame Verhalten hindert mich, den Dokumentstatus (geändert oder nicht) in Echtzeit zu erhalten. Irgendwelche Vorschläge werden sehr geschätzt.

[Sample Request und Response] Der Antrag ist nur Google Drive Listfiles: https://www.googleapis.com/drive/v2/files

Hier ist der Teil der Antwort JSON, und man kann sehen, dass die ModifiedDate früher als ModifiedByMeDate ist.

{ 
"kind": "drive#fileList", 
"etag": "\"3NNCnvnQuji-pODa6SMQ6atlc3M/oKnf21kAcJKTCIycS597xCSR2bk\"", 
"selfLink": "https://www.googleapis.com/drive/v2/files", 
"items": [ 
    { 
    "kind": "drive#file", 
    "id": "1lZjcJIf3Chuu5upFqtiqfTRnRw7*****rFL_tlO8A", 
    "etag": "\"3NNCnvnQuji-pODa6SMQ6atlc3M/MTM1NDY5MzMyMzQ1Mg\"", 
    "selfLink": "https://www.googleapis.com/drive/v2/files/1lZjcJIf3Chuu5upFqtiqfTRnRw7wSUjbRurFL_tlO8A", 
    "alternateLink": "https://docs.google.com/a/*****.com/document/d/1lZjcJIf3Chuu5upFqtiqfTRnRw7wSUjbRurFL_tlO8A/edit", 
    "embedLink": "https://docs.google.com/a/*****.com/document/d/1lZjcJIf3Chuu5upFqtiqfTRnRw7wSUjbRurFL_tlO8A/preview", 
    "iconLink": "https://ssl.gstatic.com/docs/doclist/images/icon_11_document_list.png", 
    "thumbnailLink": "https://docs.google.com/feeds/vt?gd=true&id=1lZjcJIf3Chuu5upFqtiq*****7wSUjbRurFL_tlO8A&v=22&s=AMedNnoAAAAAU*****UK74n3UiIg0L4TY-NwP3EaAU&sz=s220", 
    "title": "TestFile", 
    "mimeType": "application/vnd.google-apps.document", 
    "labels": { 
    "starred": false, 
    "hidden": false, 
    "trashed": false, 
    "restricted": false, 
    "viewed": true 
    }, 
    "createdDate": "2012-07-24T08:14:13.918Z", 
    "modifiedDate": "2012-12-06T01:49:57.982Z", 
    "modifiedByMeDate": "2012-12-06T01:49:57.982Z", 
    "lastViewedByMeDate": "2012-12-06T01:50:06.974Z", 
    "parents": [ 
    { 
    "kind": "drive#parentReference", 
    "id": "0AJ-aGTt-gWksUk9PVA", 
    "selfLink": "https://www.googleapis.com/drive/v2/files/1lZjcJIf3Chuu5upFqtiqfTRnRw7wSUjbRurFL_tlO8A/parents/0AJ-aGTt-gWksUk9PVA", 
    "parentLink": "https://www.googleapis.com/drive/v2/files/0AJ-aGTt-gWksUk9PVA", 
    "isRoot": true 
    } 
    ], 
    "exportLinks": { 
    "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "https://docs.google.com/feeds/download/documents/export/Export?id=1l*****huu5upFqtiqfTRnRw7wSUjbRurFL_tlO8A&exportFormat=docx", 
    "application/vnd.oasis.opendocument.text": "https://docs.google.com/feeds/download/documents/export/Export?id=1lZjcJIf3Chuu5upF*****SUjbRurFL_tlO8A&exportFormat=odt", 
    "text/html": "https://docs.google.com/feeds/download/documents/export/Export?id=1lZjcJIf3Chuu5upFqtiqfTRnRw7wSUj*****L_tlO8A&exportFormat=html", 
    "application/rtf": "https://docs.google.com/feeds/download/documents/export/Export?id=1lZjcJIf3Chuu5upFqtiq*****SUjbRurFL_tlO8A&exportFormat=rtf", 
    "text/plain": "https://docs.google.com/feeds/download/documents/export/Export?id=1lZjcJIf3Chuu5upFqtiqf*****SUjbRurFL_tlO8A&exportFormat=txt", 
    "application/pdf": "https://docs.google.com/feeds/download/documents/export/Export?id=1lZjcJIf3C*****fTRnRw7wSUjbRurFL_tlO8A&exportFormat=pdf" 
    }, 
    "userPermission": { 
    "kind": "drive#permission", 
    "etag": "\"3NNCnvnQuji-pODa6SMQ6atlc3M/6LfqbkrWujmUe1WSDkyhTxdIUCc\"", 
    "id": "me", 
    "selfLink": "https://www.googleapis.com/drive/v2/files/1lZjcJIf3Chuu5upFqtiqfTRnRw7wSUjbRurFL_tlO8A/permissions/me", 
    "role": "owner", 
    "type": "user" 
    }, 
    "quotaBytesUsed": "0", 
    "ownerNames": [ 
    "***** *****" 
    ], 
    "lastModifyingUserName": "***** *****", 
    "editable": true, 
    "writersCanShare": true, 
    "appDataContents": false 
    }, 
+1

Fügen Sie eine Beispielanforderung mit der entsprechenden JSON-Antwort hinzu, die anzeigt, dass sich der lastModified-Wert nicht geändert hat. –

+0

Hallo Claudio, ich habe gerade die Beispielantwort JSON beigefügt. – asir6

+0

Wenn Sie das Feld "modifiedDate" beim Senden einer Aktualisierungsanforderung festlegen möchten, müssen Sie auch setModifiedDate = true in den Anforderungsparametern festlegen: https://developers.google.com/drive/v2/reference/files/update –

Antwort

2

Google Infrastruktur aktualisiert Google Docs asynchron nach Updates. Soweit ich weiß, betrifft dies Etag, Thumbnails und wahrscheinlich auch md5sum und bestimmte modifizierte Daten.

Einige Dokumente von Google, die bestätigen, welche Elemente asynchron und welche synchron sind, wären für Entwickler enorm nützlich.

+0

Wie hast du das entdeckt? War es nur durch das Experimentieren mit der API? Ich wäre interessiert zu wissen, ob Ihre Kommentare noch wahr sind, 3 Jahre später ... – kiwidrew

+0

Experimentieren. Ich bezweifle, dass sich das geändert hat, denn das würde eine völlige Neugestaltung der Infrastruktur erfordern. Die Leistung kann jedoch so sein, dass die Verzögerung nicht wahrnehmbar ist. – pinoyyid

+0

Ok, danke, dass du mich informiert hast! – kiwidrew

6

Dies beantwortet nicht die Frage, aber ich möchte nur kommentieren, was etag und modifiedDate bedeutet auf File Ressourcen. Fileetag scheint nur direkt dem modifiedDate Wert zu entsprechen. Der zweite Teil der etag (nach dem Schrägstrich) ist nur eine Codierung der modifiedDate.

In der Documents List API gibt es eine Eigenschaft namens app:edited neben der updated Eigenschaft (die hier modifiedDate entspricht). Die Art und Weise, wie sich diese Zeitstempel ändern, ist nicht eindeutig dokumentiert, aber ich habe festgestellt, dass sich app:edited bei fast jeder Änderung (z. B. Darstellen einer Datei, selbst wenn ein anderer Benutzer mich richtig erinnert) und updated Änderungen (z. B. bei Inhaltsänderungen und Erlaubnis Änderungen). Und die etag vorher entspricht direkt app:edited, was gut ist, denn eine Änderung von app:edited zeigt an, dass es wirklich eine Änderung gab (manchmal ändert es sich jedoch zu sehr, wie das Darstellen einer Datei durch einen anderen Benutzer, da es das nicht wirklich beeinflusst Metadaten des aktuellen Benutzers).

Was ich sagen möchte, ist, dass ich glaube, dass Dokumente Liste etag (und mit der app:edited Eigenschaft) ist besser als die Drive API mit modifiedDate nur. Das Problem mit letzterem ist, dass Sie keine zuverlässige Möglichkeit haben, festzustellen, ob sich eine File Ressource geändert hat oder nicht. Wenn Sie beispielsweise nur überprüfen möchten, ob sich eine File-Ressource geändert hat, könnten Sie die Methode files.get mit einem Header If-None-Match unter Verwendung der etag verwendet haben. Aber etag ändert sich nicht immer, weil sich modifiedDate nicht immer ändert. Es ändert sich beispielsweise, wenn neuer Inhalt oder geänderte ACL oder geänderte Beschreibung vorhanden ist, sich jedoch nicht ändert, z. B. wenn Papierkorb oder Eltern geändert wurden. Wenn Sie zwei Ressourcen vergleichen, können Sie nicht zuverlässig feststellen, welche neuere ist. Fügen Sie die Tatsache hinzu, dass modifiedDate eingestellt werden kann (z. B. wäre es möglich, die modifiedDate auf einen früheren Wert oder sogar einen konstanten Wert und die etag damit einzustellen). Der beabsichtigte Zweck von etag ist verloren. Es gibt viele Fälle, in denen wir uns nicht einfach auf die Änderungsliste verlassen können, und wenn etag sich ordnungsgemäß verhält, wäre es eine große Hilfe, die aufgetretenen Änderungen zu ermitteln.

Was ich vorschlage ist, das Verhalten von etag wiederherzustellen, um dem Documents List API ähnlich zu sein. Und um herauszufinden, welche Ressource neuere Informationen enthält, fügen Sie auch die app:edited-Eigenschaft hinzu (ich denke, nur den Wert von etag zu dokumentieren ist genug, wie offiziell zu sagen, dass der zweite Teil eine Codierung eines Zeitstempels ist, auf die wir uns verlassen können es wird immer größer). Außerdem denke ich, es ist besser, nur die modifiedDate Eigenschaft auf Inhaltsänderung und nichts anderes zu ändern (z. B. nicht mit ACL Änderungen oder Beschreibung Änderungen).

Ebenso ist etag von Revision(List) Ressourcen von Verbatim-Dateien nicht sehr nützlich. Da sich die downloadUrl Eigenschaft regelmäßig ändert, ändert sich die etag s von Revision und die gesamte Liste damit, wodurch es nutzlos wird (weil Sie es nicht verwenden können, um zu überprüfen, ob sich die Revisionen nicht geändert haben). Gut, dass es die md5Checksum Eigenschaft gibt, die Sie vergleichen können, aber es ist in einigen Fällen nicht zuverlässig.