【问题标题】:Etag and LastModifiedDate donot change after file editingEtag 和 Last Modified Date 在文件编辑后不会更改
【发布时间】:2012-11-22 21:49:20
【问题描述】:

在 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
  },

【问题讨论】:

  • 请添加一个带有相应 JSON 响应的示例请求,表明 lastModified 值没有改变。
  • 嗨克劳迪奥,我刚刚附上了示例响应 JSON。
  • 如果要在发送更新请求时设置 modifiedDate 字段,还需要在请求参数中设置 setModifiedDate=true:developers.google.com/drive/v2/reference/files/update
  • @ClaudioCherubino:文档的 ETag 值怎么样,它是否像 stackoverflow.com/a/13738347/1097104 建议的那样异步更新?如果是,那么我怎样才能可靠地检测到文档已被其他人修改?

标签: google-docs google-docs-api google-drive-api


【解决方案1】:

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

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

我想说的是,我认为 Documents List 的 etag(并具有 app:edited 属性)比仅具有 modifiedDate 的 Drive API 更好。后者的问题是您没有可靠的方法来确定File 资源是否已更改。例如,如果您只想检查 File 资源是否已更改,则可以使用带有 If-None-Match 标头的 files.get 方法,使用 etag。但是etag 并不总是改变,因为modifiedDate 并不总是改变。例如,当有新内容、更改 ACL 或更改描述时,它会更改,但不会更改,例如,当已删除或更改父级时。在比较两种资源时,您无法可靠地确定哪一种较新。添加可以设置modifiedDate 的事实(例如,可以将modifiedDate 设置为更早的值,甚至是一个常量值,以及etag)。 etag 的预期用途丢失了。在很多情况下,我们不能只依赖更改列表,如果etag 行为正常,这将有助于确定发生的更改。

我的建议是将etag 的行为恢复为类似于文档列表API。并且为了帮助确定哪个资源具有更新的信息,还添加回 app:edited 属性(我认为仅记录 etag 的值就足够了,就像官方说第二部分是时间戳的编码一样,所以我们可以依靠它一直在增加)。另外,我认为最好只更改内容修改时的 modifiedDate 属性,而不是其他任何内容(例如,不更改 ACL 或更改描述)。

同样,Revision(List)etag 的逐字文件资源也不是很有用。由于downloadUrl 属性定期更改,每个Revisionetags 和整个列表都会随之更改,使其无用(因为您无法使用它来检查修订是否没有更改)。好在有 md5Checksum 属性您可以比较,但在某些情况下它并不可靠。

【讨论】:

    【解决方案2】:

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

    Google 的一些文档确认哪些项目是异步的,哪些是同步的,这对开发人员来说非常有用。

    【讨论】:

    • 您是如何发现这一点的?只是通过对 API 进行试验吗?我很想知道 3 年后你的 cmets 是否仍然正确......
    • 实验。我怀疑它是否发生了变化,因为这需要对基础设施进行全面重新设计。但是,性能可能会导致延迟难以察觉。
    • 由于 Google Docs 是协作的,它们运行在一个完全不同的系统上,类似于 Google 现已失效的 Realtime API。在协作设置中,必须存储每个单独的更改,因此实际上“在”您的云端硬盘中的内容是通往 Google 核心某处不同流程的快捷方式,并且更改不会立即反映在云端硬盘中。
    【解决方案3】:

    etag 实际上是文件元数据的散列,并且在实践中经常如此。如果您更改常规文件的任何内容(不是文档或工作表,请参见下文),或者只是使用例如“触摸”它

    https://www.googleapis.com/drive/v2/files/blah_my_file_id/touch
    

    元数据已更改,您在响应中返回的 etag 将有所不同。我的应用程序,可能还有成千上万的其他应用程序,完全依赖于这种行为。 如果您看到不同,它在您的设置中的某个地方。 OP 说“你可以看到 ModifiedDate 早于 ModifiedByMeDate”......呃,不是。他们提供的 JSON 响应是相同的。 “LastViewedByMeDate”不同。

    Google Docs、Sheets 等是一个完全不同的系统,因为它们是协作的。协作系统保持个人变化,并且需要非常复杂的逻辑来保持一切正常;它们不仅仅是普通文件。您的云端硬盘“中”的内容只是 Google 洞穴中其他地方运行的进程的快捷方式,您从云端硬盘读取的元数据很可能与最近的更改不同步。 Google 现已撤消的协作式 Realtime API(我不知道它可能仍会驱动 Docs 和 Sheets)提供了 serverRevision 属性,这是跟踪是否发生任何更改的可靠方法。

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 2015-03-19
      • 2010-10-23
      • 2021-03-15
      • 2021-09-26
      • 2020-03-08
      • 2017-12-09
      • 2019-09-25
      • 1970-01-01
      相关资源
      最近更新 更多