为什么我会从Google Drive Rest API拒绝服务器回复?

时间:2018-09-05 09:04:23

标签: qt google-api google-drive-api google-oauth

我的目标:

我正在尝试将我的Qt桌面应用程序与Google驱动器连接。现在我的目标很简单,即从驱动器中获取所有文件的列表(以JSON形式)

我到目前为止所做的。

我已遵循本教程Connecting your Qt application with Google Services using OAuth 2.0并为其创建了自己的包装器类。我遵循了所有步骤,直到调用了grant()函数。范围是https://www.googleapis.com/auth/drive。到目前为止,一切都很好。

我使用了tokensReceived发出的信号QOAuthHttpServerReplyHandler并存储了access_token。简而言之,我能够验证我的应用程序并获取访问令牌。现在对我来说,下一步是执行一个简单的get请求。这就是我所做的

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 \”错误\“:{\ n \”错误\“:[\ n {\ n \”域\“:   \“ global \”,\ n \“ reason \”:\“必填”,\ n \“ message \”:\“   此方法需要'fields'参数。\“,\ n
  \“ locationType \”:\“参数\”,\ n \“ location \”:\“字段\” \ 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 个答案:

答案 0 :(得分:1)

“禁止”很可能表示他们的访问令牌或您应用令牌的方式有问题。

最简单的测试方法是

https://www.googleapis.com/drive/v3/files?access_token=Yourtoken

您可以将其添加到您的代码中,也可以将其放置在Web浏览器中,因为它具有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=*"));