在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
},
答案 0 :(得分:6)
这不回答这个问题,但我想就etag
和modifiedDate
在File
资源上的含义发表评论。 File
etag
似乎只是直接对应modifiedDate
值。 etag
的第二部分(在斜杠之后)只是modifiedDate
的编码。
在Documents List API中,除了app:edited
属性(这里似乎对应updated
)之外,还有一个名为modifiedDate
的属性。这些时间戳改变的方式没有明确记录,但我注意到app:edited
实际上每次更改都会发生变化(例如,如果我没记错的话,即使是另一个用户,也会对文件进行主演)和updated
更改更有限(例如,内容修改和权限更改)。前面的etag
直接对应app:edited
,这很好,因为app:edited
的更改表明确实存在更改(有时它会发生太大变化,就像文件的主演一样不同的用户,因为它不会真正影响当前用户的元数据。)
我想说的是,我认为文档列表的etag
(并且具有app:edited
属性)优于仅具有modifiedDate
的云端硬盘API。后者的问题是您没有可靠的方法来确定File
资源是否已更改。例如,如果您只想检查File
资源是否已更改,则可以使用带有If-None-Match
标头的files.get方法使用etag
。但etag
并不总是会改变,因为modifiedDate
并不总是会改变。例如,当有新内容,更改ACL或更改描述时,它会更改,但不会更改,例如,在删除或父项更改时。比较两个资源时,您无法可靠地确定哪个资源更新。添加modifiedDate
可以设置的事实(例如,可以将modifiedDate
设置为更早的值,甚至是常数值,etag
可以设置它。 etag
的预期目的丢失了。在许多情况下,我们不能仅仅依赖于更改列表,如果etag
行为正常,那么确定所发生的更改将会有很大帮助。
我建议将etag
的行为恢复为与文档列表API类似。并且为了帮助确定哪个资源具有更新的信息,还要添加app:edited
属性(我认为只记录etag
的值就足够了,就像正式说第二部分是a的编码一样时间戳,以便我们可以依赖它总是增加)。另外,我认为最好只更改内容修改的modifiedDate
属性,而不是其他任何内容(例如,不更改ACL更改或描述更改)。
同样,etag
个Revision(List)
个逐字文件资源也不是很有用。由于downloadUrl
属性会定期更改,因此每个etag
的{{1}}和整个列表会随之更改,因此无法使用(因为您无法使用它来检查修订版是否无效)不要改变。好的东西是你可以比较的Revision
属性,但在某些情况下它不可靠。
答案 1 :(得分:2)
Google的基础架构在更新后异步更新Google文档。据我所知,这会影响etag,缩略图,可能还有md5sum和某些修改日期。
Google的一些文档确认哪些项是异步的,哪些是同步的,这对开发人员非常有用。
答案 2 :(得分: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属性,该属性是跟踪是否发生任何更改的可靠方法。