【发布时间】:2020-08-27 16:52:55
【问题描述】:
我正在使用客户端 js Google Drive API,但我似乎无法读取/下载之前由相同 api 创建的文本文件。
我在 files/fileID 和 webContentLink url 上尝试了 files.get、手动请求和 google 请求。
webContentLink 如果我在浏览器中打开它但不是通过请求打开它,即使我在浏览器中获得授权(存在 cookie)并在请求中发送令牌(url 和 header)。
fileId
wcLink = webContentLink
oToken = oauthToken
测试1
关于 webContentLink 的 Google 请求
返回 404 未找到
let r = gapi.client.request({
'path': wcLink,
'method': 'GET',
'params': {'fileId': fileId, 'alt': 'media'},
'headers': {'Authorization': 'Bearer ' + oToken }
})
r.execute((response,rawData)=>{ //callback not called at all
console.log('resp',response)
console.log('raw',rawData)
})
测试2
对文件/fileId 的 Google 请求,使用 .execute
返回 200 OK,响应未定义且原始内容为空,内容长度为 0
let r = gapi.client.request({
'path': 'https://www.googleapis.com/drive/v3/files/'+fileId,
'method': 'GET',
'params': {'fileId': fileId, 'alt': 'media'},
'headers': {'Authorization': 'Bearer ' + oToken }
})
r.execute((response,rawData)=>{
console.log('resp',response) //undefined
console.log('raw',rawData) //body:'', content-length:0
})
测试3
drive.files.get on fileId
返回 200 OK,响应结果:false,正文:''
gapi.client.drive.files.get({
'fileId': fileId,
'alt': 'media'
})
.then((response,rawData)=>{
console.log('resp',response) //result: false, body: ''
console.log('raw',rawData) //undefined
})
测试4
对文件/fileId 的 Google 请求,使用 .then
返回 200 OK,响应结果:false,正文:''
gapi.client.request({
'path': 'https://www.googleapis.com/drive/v3/files/'+fileId,
'method': 'GET',
'params': {'fileId': fileId, 'alt': 'media'},
'headers': {'Authorization': 'Bearer ' + oToken }
})
.then((response,rawData)=>{
console.log('resp',response) //result: false, body: ''
console.log('raw',rawData) //undefined
})
测试5
对文件/fileId 的 http 请求
返回 403 禁止,CORS 警告
var xhr = new XMLHttpRequest();
xhr.open('GET',
'https://www.googleapis.com/drive/v3/files/' + fileId +
'?alt=media&access_token=' + encodeURIComponent(oToken), true)
xhr.responseType = "blob"
xhr.onreadystatechange = ()=>{
console.log('readyStateChange',xhr)
}
xhr.setRequestHeader('Authorization', 'Bearer ' + oToken)
xhr.send()
测试6
webContentLink 上的 http 请求,链接中带有访问令牌
返回 401 Unauthorized,CORS 警告
let reqUrl = wcLink + '&access_token=' + encodeURIComponent(oToken)
var xhr = new XMLHttpRequest()
xhr.open("GET", reqUrl, true)
xhr.responseType = "blob"
xhr.onreadystatechange = ()=>{
console.log('readyStateChange',xhr)
}
xhr.setRequestHeader('Authorization', 'Bearer ' + oToken)
xhr.send()
测试7
webContentLink 上的 http 请求,链接中没有访问令牌,没有 responseType
我不明白这与上面的示例有何不同,在上面的示例中,我在 url 和 header 中都传递 access_token 并获得 401 unathorized 但在这里我只传递了 header 并获得 200 ok...
返回 200 OK,CORS 警告
let xhr = new XMLHttpRequest()
xhr.onreadystatechange = ()=>{
console.log('response',xhr)
}
xhr.open('GET', wcLink, true)
xhr.setRequestHeader('Authorization', 'Bearer ' + oToken)
xhr.send()
【问题讨论】:
-
i.stack.imgur.com/5ejBC.png 处的图像显示一些响应是 401、403 和 404 错误。对于 4xx 错误,这是正常的,并且预期该错误不会有 Access-Control-Allow-Origin 响应标头。这是因为默认情况下,大多数服务器仅在 4xx 响应中发送最小的标头集。要在错误响应中包含其他标头,通常必须设置一些非默认选项。但即使那些 4xx 错误确实有 Access-Control-Allow-Origin 响应标头,它们仍然是需要修复的 4xx 错误。它们没有“被 CORS 阻止”——它们只是错误。
-
@sideshowbarker 好的,但他们仍然没有理由发生,我仍然在 url、标题和我得到了我登录的 cookie 中传递访问令牌......我为什么要被未经授权和禁止?
-
你试过使用
files: getTry this API吗?你仍然得到相同的结果吗?您是否将字段参数设置为获取默认kind、id,、name,和mimeType以外的内容? -
@RafaGuillermo 我正在使用 files.get 来获取这些测试中使用的 webContentLink,并且我正在使用带有 'alt': 'media' 的 files.get,就像在文档中为 downloading 描述的那样,在测试3。
-
@LukaKostic 你确定你的文本文件有正确的元数据并且有内容吗?您可以发布用于创建所述文件的代码吗?我从本地机器上传了一个 txt 文件到云端硬盘并运行 this function,这让我可以看到响应中的正文,其中包含预期的文件内容。
标签: javascript google-drive-api xmlhttprequest cors