Итак, у меня возникла следующая проблема:
Я пытаюсь получить данные из 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, он не может кэшировать код состояния.