为啥我从 google drive rest api 得到服务器回复被禁止?
Posted
技术标签:
【中文标题】为啥我从 google drive rest api 得到服务器回复被禁止?【英文标题】:Why am I getting server replied forbidden from google drive rest api?为什么我从 google drive rest api 得到服务器回复被禁止? 【发布时间】:2018-09-05 09:04:23 【问题描述】:我的目标:
我正在尝试将我的 Qt 桌面应用程序与谷歌驱动器连接。现在我的目标很简单,即从我的驱动器中获取所有文件的列表(以 JSON 形式)
到目前为止我做了什么。
我已经按照本教程Connecting your Qt application with Google Services using OAuth 2.0 为它创建了我自己的包装类。在调用 grant() 函数之前,我已经执行了所有步骤。范围是https://www.googleapis.com/auth/drive
。到目前为止一切正常。
我使用了从QOAuthHttpServerReplyHandler
发出的信号tokensReceived
并存储了access_token。所以简而言之,我能够验证我的应用程序并获取访问令牌。现在对我来说下一步是执行一个简单的获取请求。这就是我所做的
void Google_Drive::Send_Request()
QNetworkRequest request(QUrl("https://www.googleapis.com/drive/v3/files"));
request.setRawHeader("Authorization", QByteArray("Bearer ")+mAccessToken);
mManager.get(request);
我遇到的错误:
我收到的回复是
“传输https://www.googleapis.com/drive/v3/files时出错 - 服务器回复:禁止”
请让我知道我错过了什么或者我做错了什么。另外,如果需要任何其他详细信息,请告诉我。谢谢!
编辑 1:
这次回复接收方法我readAll()
而不是仅仅阅读errorString()
,我发现api没有打开。所以我从开发者控制台打开了 api。现在我在设置之后现在我得到errorString()
“传输https://www.googleapis.com/drive/v3/about时出错- 服务器回复:错误请求”
从reply->readAll()
返回
"\n \"error\": \n \"errors\": [\n \n \"domain\": \"全局\",\n \"原因\": \"必填\",\n \"消息\": \" 此方法需要 'fields' 参数。\",\n \"locationType\": \"参数\",\n \"location\": \"fields\"\n \n ],\n \"code\": 400,\n \"message\": \"'fields'参数是 此方法需要。\"\n \n\n"
编辑 2: 抱歉,为了测试我使用“https://www.googleapis.com/drive/v3/about”而不是“https://www.googleapis.com/drive/v3/files”的响应。现在纠正它工作正常。
【问题讨论】:
【参考方案1】:禁止访问很可能意味着他们的访问令牌或您应用它的方式有问题。
最简单的测试方法就是这样做
https://www.googleapis.com/drive/v3/files?access_token=Yourtoken
您可以将其添加到您的代码中,也可以将其放入网络浏览器中,因为它是一个 http get 调用。
如果访问令牌有效,那么您就知道您应用授权标头的方式有问题。
QString headerData = "Bearer " + mAccessToken;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
此方法需要 'fields' 参数。
这是 google drive api 中未记录的必填字段。您必须将 fields=* 与您的所有请求一起发送。
字段选择器指定要包含在响应中的字段子集。 有关详细信息,请参阅性能提示文档中的部分响应部分。 使用以获得更好的性能。
尝试添加这个
QNetworkRequest request(QUrl("https://www.googleapis.com/drive/v3/files?fields=*"));
【讨论】:
没问题,我通过你的测试确认了。 我猜将它设置为 QByteArray 可能是个坏主意。承载只是文本 我也试过了,同样的反应,请检查我的编辑 对不起这是我的错误,我使用了错误的请求检查我的编辑 2 fields=* 将帮助您取回完整的回复,如果您不添加它,您只会得到部分回复。如果对您有帮助,请记住接受答案。以上是关于为啥我从 google drive rest api 得到服务器回复被禁止?的主要内容,如果未能解决你的问题,请参考以下文章
通过Google Drive REST API上传或创建包含内容的新文件?
如何将文件重命名为 google drive rest api?改造2
如何从 Google Drive 上传和下载文件(使用 Rest Api v3)
google drive simple upload rest API的示例