API Google Диска: файл загрузки выдает ошибкуlockedDomainCreationFailure

Я пытаюсь загрузить файл с помощью средства выбора файлов Google Диска (на основе этого примера https://gist.github.com/Daniel15/5994054). Средство выбора файлов работает нормально до того момента, когда дело доходит до загрузки файла. Он сталкивается с ошибкой 400 Bad-Request (lockedDomainCreationFailure).

Вот код:

function downloadFile(file, callback) {
  if (file.downloadUrl) {
    var accessToken = gapi.auth.getToken().access_token;
    var xhr = new XMLHttpRequest();
    xhr.open('GET', file.downloadUrl);
    xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
    xhr.onload = function() {
      callback(xhr.responseText);
    };
    xhr.onerror = function() {
      callback(null);
    };
    xhr.send();
  } else {
    callback(null);
  }
}

Вот сообщение об ошибке:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "lockedDomainCreationFailure",
    "message": "The OAuth token was received in the query string, which this API forbids for response formats other than JSON or XML. If possible, try sending the OAuth token in the Authorization header instead."
   }
  ],
  "code": 400,
  "message": "The OAuth token was received in the query string, which this API forbids for response formats other than JSON or XML. If possible, try sending the OAuth token in the Authorization header instead."
 }
}

Это говорит о том, что токен OAuth был передан в строке запроса, что, как я вижу, неверно. Вот запрос:

GET /drive/v2/files/{file-id}?key={app-key}&alt=media&source=downloadUrl HTTP/3
Host: content.googleapis.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: */*
Accept-Language: en,de;q=0.7,en-US;q=0.3
Accept-Encoding: gzip, deflate, br
Authorization: Bearer {oauth-token}
Origin: http://localhost:8800
DNT: 1
Connection: keep-alive
Referer: http://localhost:8800/
TE: Trailers

Поскольку я использую URL-адрес загрузки, предоставленный Google API, а авторизация указана в заголовке запроса, я понятия не имею, почему я сталкиваюсь с этой ошибкой.

Я ценю любые идеи.


person Suppenhuhn79    schedule 17.06.2021    source источник
comment
Проверьте, изменился ли URL-адрес запроса на ` 'googleapis.com /drive/v2/files/[FILEID]?key=[YOUR_API_KEY] HTTP/1.1`, а также указание Accept: application/json решает проблему. Также: что такое {app-id}?   -  person ziganotschka    schedule 17.06.2021
comment
Под идентификатором приложения я имею в виду ключ приложения. Я исправил это в своем ОП. Решение состояло в том, чтобы запрашивать не content.googleapis.com, а www.googleapis.com. Спасибо за этот намек! Я не знаю почему, потому что URL-адрес загрузки из Google API является первым именем хоста. Изменение заголовка Accept не требовалось. URL-адрес запроса должен содержать параметры запроса alt и source, иначе вы получите только метаданные файла, но не его содержимое. Таким образом, URL-адрес загрузки https://www.googleapis.com/drive/v2/files/{file-id}?key={app-key}&alt=media&source=downloadUrl. Еще раз большое спасибо.   -  person Suppenhuhn79    schedule 17.06.2021


Ответы (1)


Решение состояло в том, чтобы изменить хост content.googleapis.com (то, что было предоставлено в качестве URL-адреса загрузки из API Google) на www.googleapis.com. Спасибо ziganotschka за подсказку!

Таким образом, правильный URL-адрес загрузки — https://www.googleapis.com/drive/v2/files/{file-id}?key={app-key}&alt=media&source=downloadUrl. Он должен содержать параметры запроса alt и source, иначе вы получите только метаданные файла, но не его содержимое. Нет необходимости изменять заголовок Accept.

person Suppenhuhn79    schedule 18.06.2021