JavaScript url 在 json returns 501 但字符串 url 没有
JavaScript url in json returns 501 but string url does not
所以我遇到了以下问题:
我尝试使用 CloudKit(HTTP 请求)从 iCloud 中提取数据
iCloud 实体包含一个 CKAsset,我需要下载 URL,POST 请求 https://api.apple-cloudkit.com/database/1/...
returns。但是,如果我尝试从此 URL 下载数据,它会 returns 501 错误,但如果我将 URL 打印到控制台并将其粘贴到浏览器中,浏览器会下载文件。
它变得更加奇怪,因为如果我实现 URL 我直接在代码中打印到控制台,一切正常!我正在将 JSON 响应中的 URL 转换为字符串,所以 IDK 出了什么问题。
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..."
但显然这不是真正的解决方案。
非常感谢您的帮助!
编辑:
这是从 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
}
);
编辑 2:
我发现了一些可能有趣的东西:如果我将 URL 直接粘贴到代码中,状态代码 200 returns 来自磁盘缓存。我尝试以隐身模式加载网站,但我不得不重新加载一次才能使其正常运行。因为我每次刷新都会收到一个新的下载 ID,所以它无法缓存状态代码。
如果 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;
您上面的代码确实可以将 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);
好的,所以我找到了解决方案。这与实际的 URL 无关,没关系,而是 zip.js 下载数据的方式。它首先发出 HEAD 请求,因为 iCloud 服务器不支持这些,它 returns 501。静态域工作是因为它以某种方式缓存 200 OK,即使 501 返回。
感谢大家的帮助!
所以我遇到了以下问题:
我尝试使用 CloudKit(HTTP 请求)从 iCloud 中提取数据
iCloud 实体包含一个 CKAsset,我需要下载 URL,POST 请求 https://api.apple-cloudkit.com/database/1/...
returns。但是,如果我尝试从此 URL 下载数据,它会 returns 501 错误,但如果我将 URL 打印到控制台并将其粘贴到浏览器中,浏览器会下载文件。
它变得更加奇怪,因为如果我实现 URL 我直接在代码中打印到控制台,一切正常!我正在将 JSON 响应中的 URL 转换为字符串,所以 IDK 出了什么问题。
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..."
但显然这不是真正的解决方案。
非常感谢您的帮助!
编辑:
这是从 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
}
);
编辑 2:
我发现了一些可能有趣的东西:如果我将 URL 直接粘贴到代码中,状态代码 200 returns 来自磁盘缓存。我尝试以隐身模式加载网站,但我不得不重新加载一次才能使其正常运行。因为我每次刷新都会收到一个新的下载 ID,所以它无法缓存状态代码。
如果 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;
您上面的代码确实可以将 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);
好的,所以我找到了解决方案。这与实际的 URL 无关,没关系,而是 zip.js 下载数据的方式。它首先发出 HEAD 请求,因为 iCloud 服务器不支持这些,它 returns 501。静态域工作是因为它以某种方式缓存 200 OK,即使 501 返回。
感谢大家的帮助!