Etag和LastModifiedDate在文件编辑后不会更改

问题描述 投票:5回答:3

在GoogleDrive中编辑文档后,似乎LastModified值有时不会立即更改。该值似乎将在几分钟后更新。

我试图通过DriveSDK来获取文档的Etag,它也恰好是Etag值。

这种奇怪的行为使我无法实时获取文档状态(已修改或未修改)。任何建议将不胜感激。

[样品请求和响应]该请求只是GoogleDrive ListFiles:https://www.googleapis.com/drive/v2/files

这是响应JSON的一部分,您可以看到ModifiedDate早于ModifiedByMeDate。

 {
 "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
  },
google-docs google-docs-api google-drive-api
3个回答
6
投票

这不能回答问题,但是我想评论一下etagmodifiedDateFile资源上的含义。Fileetag似乎直接对应于modifiedDate值。 etag的第二部分(在斜线之后)只是modifiedDate的编码。

在Documents List API中,除了app:edited属性(这里似乎与updated相对应)之外还有一个名为modifiedDate的属性。这些时间戳记更改的方式没有明确记录,但我注意到app:edited几乎在每次更改时都发生更改(例如,如果我没记错的话,甚至由另一个用户加注星标),并且updated更改受到的限制更大(例如用于内容修改和权限更改)。并且之前的etag直接对应于app:edited,这很好,因为app:edited的更改表示确实存在更改(尽管更改有时太大,例如由不同用户对文件加注星标,并不会真正影响当前用户的元数据。

[我想说的是,我认为文档列表的etag(并具有app:edited属性)比仅具有modifiedDate的Drive API更好。后者的问题是您没有确定File资源是否已更改的可靠方法。例如,如果您只想检查File资源是否已更改,则可以使用If-None-Match将files.get方法与etag标头一起使用。但是etag并不总是更改,因为modifiedDate并不总是更改。例如,当有新内容,更改了ACL或更改了描述时,它会更改,但是例如,在被丢弃或更改父项时,它不会更改。比较两个资源时,您无法可靠地确定哪个资源是较新的。添加可以设置modifiedDate的事实(例如,可以将modifiedDate设置为更早的值,甚至是恒定值,然后将etag设置为它)。 etag的预期目的丢失了。在很多情况下,我们不能仅依靠更改列表,并且如果etag的行为正常,则对于确定已发生的更改将有巨大帮助。

我建议将etag的行为还原为类似于Documents List API。为了帮助确定哪个资源具有较新的信息,还应添加回app:edited属性(我认为仅记录etag的值就足够了,就像正式地说第二部分是时间戳的编码一样,因此我们可以依靠它不断增加)。另外,我认为最好只在内容修改时更改modifiedDate属性,而别无其他选择(例如,不进行ACL更改或描述更改)。

类似地,逐字文件的etag资源中的Revision(List)也不是很有用。由于downloadUrl属性会定期更改,因此每个etag和整个列表的Revision都会随之更改,从而使其无用(因为您无法使用它来检查版本是否未更改)。好东西是可以比较的md5Checksum属性,但是在某些情况下不可靠。


2
投票

Google的基础架构在更新后异步更新Google文档。据我所知,这会影响etag,缩略图以及md5sum和某些修改日期。

Google的一些文档,其中的哪些内容是异步的,哪些是同步的,对开发人员非常有用。


0
投票

etag实际上是文件元数据的散列,实际上通常是散列。如果您更改了有关常规文件(而不是文档或表格,请参见下文)的任何内容,或者仅使用“

“触摸”它
https://www.googleapis.com/drive/v2/files/blah_my_file_id/touch

元数据已更改,并且您在响应中返回的etag将有所不同。我的应用程序(可能还有数千个其他应用程序)完全取决于此行为。如果您看到不同的地方,那就在您的设置中。 OP在其中说“您可以看到ModifiedDate早于ModifiedByMeDate” ...嗯,不是。您提供的JSON响应中相同。 “ LastViewedByMeDate”不同。

Google文档,表格等是完全不同的系统,因为它们是协作的。协作系统会保留单个更改,并且需要非常复杂的逻辑来保持所有更改。它们不仅是常规文件。云端硬盘中的内容只是在Google洞穴中其他地方运行的流程的捷径,您从其中读取的元数据很可能与最近的更改不同步。 Google现在撤回的协作式Realtime API(我不知道,它可能仍然可以驱动Docs和Sheets)提供了serverRevision属性,该属性是跟踪是否发生任何更改的可靠方法。

© www.soinside.com 2019 - 2024. All rights reserved.