Почему я получаю ответ сервера запрещен от API привода Google Диска? - PullRequest
0 голосов
/ 05 сентября 2018

Моя цель:

Я пытаюсь подключить свое настольное приложение Qt к Google Drive. Сейчас моя цель проста, т.е. получить список всех файлов с моего диска (в форме JSON)

То, что я сделал до сих пор.

Я следовал этому руководству Соединение вашего приложения Qt со Службами Google с использованием 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 \" error \ ": {\ n \" errors \ ": [\ n {\ n \" domain \ ": \ "global \", \ n \ "причина \": \ "требуется \", \ n \ "сообщение \": \ "The Для этого метода требуется параметр '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 Ответ

0 голосов
/ 05 сентября 2018

Запрещено, скорее всего, означает, что у них что-то не так с токеном доступа или способом, которым вы его применяете.

Самый простой способ проверить это сделать

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

Вы можете либо добавить его в свой код, либо просто поместить его в веб-браузер, так как это вызов http get.

Если маркер доступа работает, то вы знаете, что с применением заголовка авторизации что-то не так.

QString headerData = "Bearer " + mAccessToken;
request.setRawHeader("Authorization", headerData.toLocal8Bit());

Для этого метода требуется параметр 'fields'.

Это недокументированное обязательное поле в API Google Drive. Вы должны отправить поля = * со всеми вашими запросами.

fields Selector, определяющий подмножество полей для включения в ответ.
Для получения дополнительной информации см. Раздел с частичным ответом в документе «Советы по повышению эффективности». Используйте для лучшей производительности.

попробуйте добавить это

QNetworkRequest request(QUrl("https://www.googleapis.com/drive/v3/files?fields=*"));
...