JavaScript url в json возвращает 501, но строковый url - нет - PullRequest
0 голосов
/ 27 мая 2020

Итак, у меня возникла следующая проблема:

Я пытаюсь получить данные из iCloud с помощью CloudKit (HTTP-запросы). Сущность iCloud содержит CKAsset, и мне нужен URL-адрес загрузки, который возвращает запрос POST на https://api.apple-cloudkit.com/database/1/.... . Однако, если я попытаюсь загрузить данные с этого URL-адреса, он вернет ошибку 501, но если я напечатаю URL-адрес на консоли и вставлю его в браузер, браузер загрузит файл.

Это становится еще более странным потому что, если я введу URL-адрес, который я напечатал на консоли, прямо в код, все будет работать! Я конвертирую URL-адрес в ответе JSON в строку, чтобы определить, что не так.

Ответ CloudKit:

{ "records" : [ { "recordName" : "xxxxxxxxxxxx", "recordType" : "xxxxxxx", "fields" : { "file" : { "value" : { "fileChecksum" : "AZJ1FbmpL7caqaksfwrFm3586o5+", "size" : 303, "downloadURL" : "https://cvws.icloud-content.com/B/AZJ1Fbmpxxxaxxxxxxx/${f}?xxxxxxxx..." }, "type" : "ASSETID" },},} ] }

Я сократил ответ, чтобы он содержал только релевантный материал.

Я пытался получить URL-адрес со следующим кодом: var url = data["records"][0]["fields"]["file"]["value"]["downloadURL"];

Уже пробовал с .toString() и var url == "" + data["records"]....

Это работает, если я сделаю var url = "https://cvws.icloud-content.com/B/AZJ1Fbmpxxxaxxxxxxx/${f}?xxxxxxxx..." но очевидно, что это не настоящее решение.

Помощь очень ценится!

EDIT:

Вот код, который загружает файл из downloadURL. Я использую библиотеку под названием zip. js, потому что это файл zip (с другим расширением):

zip.createReader(
new zip.HttpReader(url),
function (reader) {
  reader.getEntries(async function (entries) {
    if (entries.length) {
      entries[0].getData(
        new zip.TextWriter(),
        async function (text) {

          reader.close(function () {
            // onclose callback
          });
        },
        function (current, total) {
          // onprogress callback
        }
      );
    } else {
    }
  });
},
function (error) {
  // onerror callback
}
);

EDIT 2:

Я обнаружил кое-что, что может быть интересно: если я вставлю URL прямо в код, код состояния 200 вернется из кеша диска. Я попытался загрузить сайт в режиме инкогнито, и мне пришлось перезагрузить один раз, чтобы он заработал. Поскольку я получаю новый идентификатор загрузки при каждом обновлении sh, он не может кэшировать код состояния.

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Код, который у вас выше, действительно работает для извлечения URL-адреса из объекта (выполните код ниже). Вы уверены, что data содержит информацию в ожидаемом вами формате и что URL-адрес правильный?

var data = { "records" : [ { "recordName" : "xxxxxxxxxxxx", "recordType" : "xxxxxxx", "fields" : { "file" : { "value" : { "fileChecksum" : "AZJ1FbmpL7caqaksfwrFm3586o5+", "size" : 303, "downloadURL" : "https://cvws.icloud-content.com/B/AZJ1Fbmpxxxaxxxxxxx/${f}?xxxxxxxx..." }, "type" : "ASSETID" },},} ] };

// Original
var url = data["records"][0]["fields"]["file"]["value"]["downloadURL"];

// Object notation
var url2 = data.records[0].fields.file.value.downloadURL;

console.log(url);
console.log(url2);
1 голос
/ 27 мая 2020

Это работает, если URL-адрес действителен.

Вам нужно посмотреть вкладку сети, чтобы узнать, в чем дело. Например, $ {f} выглядит подозрительно

const data = {
  "records": [{
    "recordName": "xxxxxxxxxxxx",
    "recordType": "xxxxxxx",
    "fields": {
      "file": {
        "value": {
          "fileChecksum": "AZJ1FbmpL7caqaksfwrFm3586o5+",
          "size": 303,
          "downloadURL": "https://cvws.icloud-content.com/B/AZJ1Fbmpxxxaxxxxxxx/${f}?xxxxxxxx..."
        },
        "type": "ASSETID"
      },
    },
  }]
}

location = data.records[0].fields.file.value.downloadURL;
0 голосов
/ 27 мая 2020

Хорошо, я нашел решение. Это не имеет ничего общего с фактическим URL-адресом, это нормально, а скорее с тем, как zip. js загружает данные. Сначала он делает запрос HEAD, и, поскольку серверы iCloud не поддерживают их, он возвращает 501. Домены stati c работали, потому что он каким-то образом кэшировал 200 OK, хотя 501.

Спасибо всем за их помощь!

...