Google drive api 获取错误-";远程服务器返回错误:(401)未经授权。”;使用Google Drive API请求文件时

Google drive api 获取错误-";远程服务器返回错误:(401)未经授权。”;使用Google Drive API请求文件时,google-drive-api,http-headers,httprequest,http-status-code-401,Google Drive Api,Http Headers,Httprequest,Http Status Code 401,当从Google Drive下载文件时,特别是扩展名为.docx、.doc或.pdf的文件,我们现在通过filePicker API使用“WebContentLink”属性,根据Google Drive API中最近的修改来获取文件。(以前,我们使用downloadUrl文件属性通过filePicker API下载文件) 但是,我们在使用HttpWebRequest通过使用承载令牌传递头来授权API下载请求时,遇到了这个不需要的异常“401-未经授权的访问” 谷歌硬盘API版本-v2 使用-文件

当从Google Drive下载文件时,特别是扩展名为.docx、.doc或.pdf的文件,我们现在通过filePicker API使用“WebContentLink”属性,根据Google Drive API中最近的修改来获取文件。(以前,我们使用downloadUrl文件属性通过filePicker API下载文件)

但是,我们在使用HttpWebRequest通过使用承载令牌传递头来授权API下载请求时,遇到了这个不需要的异常“401-未经授权的访问”

谷歌硬盘API版本-v2

使用-文件选择器API获取文件数据,即文件ID、webContentLink、alternateLink

下面是我们实现逻辑的一段代码

//fileurl - webcontentlink of the file (previously, we used downloadUrl)
//accessToken - client's accessToken 
//filepath - location to store the downloaded file
如果我们不传递头,我们可以下载文件,但不能读写它的数据,所以这是没有用的

是否有其他解决方案可以通过带有HTTP头的API请求下载请求的Google驱动器文件

注意-这是最近对Google Drive和Picker API的修改- 我们已经做了更改。

解决方案 这个解决方案是由@RuchiYevle提供给您的,他是最初的发帖人,在评论中发布了对他有用的东西。因此,这将作为社区wiki发布

由于Google Drive API现在不再支持使用access token使用下载URL下载文件的功能,我们将不得不使用URL
googleapis.com/Drive/v2/files{fileId}?alt=media


这对我来说很有效,而且,这也是他们的问题跟踪器中提到的预期行为。

用户有权访问该文件吗?是@DaImTo,我们正在使用用户的访问令牌下载文件。从google驱动器支持获得了一个解决方案-要通过HTTP请求使用驱动器API V2下载文件并在标头中设置访问令牌,您需要将其请求到此url:{fileId}?alt=media@RuchiYevle那有用吗?如果是这样的话,请你将评论正式化,以便所有遇到该问题的人都能轻松找到解决方案?@MateoRandwolf,是的。成功了。由于Google Drive API现在不再支持使用access token使用“downloadURL”下载文件的功能,我们将不得不使用URL googleapis.com/Drive/v2/files{fileId}?alt=media。这对我来说很有效,而且,这也是他们的问题跟踪中提到的预期行为
public void downloadGdriveFileThroughWebRequest(string fileurl, string filepath, string accessToken)
        {
            HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(fileurl);
            rq.Method = "GET";
            rq.PreAuthenticate = true;
            rq.Headers.Add("Authorization", "Bearer " + accessToken);
            try { 
            HttpWebResponse resp = (HttpWebResponse)rq.GetResponse();
            using (Stream output = File.OpenWrite(filepath))
            {
                using (Stream s = resp.GetResponseStream())
                {
                    byte[] buffer = new byte[8192];
                    int bytesRead;
                    while ((bytesRead = s.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        output.Write(buffer, 0, bytesRead);
                    }
                }
            }
            }

            catch (WebException ex)
            {
                using (var stream = ex.Response.GetResponseStream())
                using (var reader = new StreamReader(stream))
                {
                    reader.ReadLine();
                    Console.WriteLine(reader.ReadToEnd());
                }
            }
        }