json中的JavaScript url返回501,但字符串url不返回501
因此,我有以下问题: 我尝试使用CloudKit(HTTP请求)从iCloud中提取数据 iCloud实体包含一个CKAsset,我需要下载URL,POST请求将其发送到json中的JavaScript url返回501,但字符串url不返回501,javascript,html,http,icloud,Javascript,Html,Http,Icloud,因此,我有以下问题: 我尝试使用CloudKit(HTTP请求)从iCloud中提取数据 iCloud实体包含一个CKAsset,我需要下载URL,POST请求将其发送到https://api.apple-cloudkit.com/database/1/...返回。但是,如果我尝试从此URL下载数据,它将返回501错误,但是如果我将URL打印到控制台并将其粘贴到浏览器中,浏览器将下载该文件 更奇怪的是,如果我将打印到控制台的URL直接实现到代码中,一切都会正常工作!我正在将JSON响应中的URL
https://api.apple-cloudkit.com/database/1/...
返回。但是,如果我尝试从此URL下载数据,它将返回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文件(具有不同的文件扩展名):
编辑2:
我发现了一些有趣的事情:如果我将URL直接粘贴到代码中,状态代码200将从磁盘缓存返回。我试着在匿名模式下加载网站,我必须重新加载一次才能让它正常工作。因为每次刷新时我都会收到一个新的下载ID,所以它无法缓存状态代码。如果URL有效,则此操作有效
您需要查看“网络”选项卡以了解问题所在。例如,${f}看起来可疑
const数据={
“记录”:[{
“记录名”:“XXXXXXXXXX”,
“记录类型”:“xxxxxxx”,
“字段”:{
“文件”:{
“价值”:{
“文件校验和”:“AZJ1FBMPL7CAQAKSWRFM3586O5+”,
“尺寸”:303,
“下载URL”:https://cvws.icloud-content.com/B/AZJ1Fbmpxxxaxxxxxxx/${f}?xxxxxxxx…”
},
“类型”:“ASSETID”
},
},
}]
}
location=data.records[0].fields.file.value.downloadURL代码>如果URL有效,则此操作有效
您需要查看“网络”选项卡以了解问题所在。例如,${f}看起来可疑
const数据={
“记录”:[{
“记录名”:“XXXXXXXXXX”,
“记录类型”:“xxxxxxx”,
“字段”:{
“文件”:{
“价值”:{
“文件校验和”:“AZJ1FBMPL7CAQAKSWRFM3586O5+”,
“尺寸”:303,
“下载URL”:https://cvws.icloud-content.com/B/AZJ1Fbmpxxxaxxxxxxx/${f}?xxxxxxxx…”
},
“类型”:“ASSETID”
},
},
}]
}
location=data.records[0].fields.file.value.downloadURL代码>上面的代码可以将URL从对象中拉出(运行下面的代码)。您确定数据
以您期望的格式保存信息,并且URL正确吗
var data={“records”:[{“recordName”:“xxxxxxxxxxx”,“recordType”:“xxxxxxx”,“fields”:{“file”:{“value”:{“fileChecksum”:“AZJ1FbmpL7caqaksfwrFm3586o5+”,“size”:303,“downloadURL”:https://cvws.icloud-content.com/B/AZJ1Fbmpxxxaxxxxxxx/${f}?xxxxxxxx…},“类型”:“ASSETID”},},},}]};
//原创的
var url=data[“records”][0][“fields”][“file”][“value”][“downloadURL”];
//对象表示法
var url2=data.records[0].fields.file.value.downloadURL;
console.log(url);
console.log(url2)代码>上面的代码可以将URL从对象中拉出(运行下面的代码)。您确定数据
以您期望的格式保存信息,并且URL正确吗
var data={“records”:[{“recordName”:“xxxxxxxxxxx”,“recordType”:“xxxxxxx”,“fields”:{“file”:{“value”:{“fileChecksum”:“AZJ1FbmpL7caqaksfwrFm3586o5+”,“size”:303,“downloadURL”:https://cvws.icloud-content.com/B/AZJ1Fbmpxxxaxxxxxxx/${f}?xxxxxxxx…},“类型”:“ASSETID”},},},}]};
//原创的
var url=data[“records”][0][“fields”][“file”][“value”][“downloadURL”];
//对象表示法
var url2=data.records[0].fields.file.value.downloadURL;
console.log(url);
console.log(url2)代码>好的,我找到了一个解决方案。这与实际的URL无关,这很好,而是zip.js下载数据的方式。它首先发出HEAD请求,由于iCloud服务器不支持这些请求,因此返回501。静态域之所以能够工作,是因为它以某种方式缓存了200OK,即使501返回
谢谢大家的帮助 好的,我找到了解决办法。这与实际的URL无关,这很好,而是zip.js下载数据的方式。它首先发出HEAD请求,由于iCloud服务器不支持这些请求,因此返回501。静态域之所以能够工作,是因为它以某种方式缓存了200OK,即使501返回
谢谢大家的帮助 ${f}可以替换为任何名称,它本质上只是下载文件的名称。已尝试使用.replace()将其替换为其他内容。网络选项卡仅显示501未实现。我刚刚发现的是,HEAD请求确实返回501(我使用paw测试http请求),但是为什么我手动实现的URL可以工作呢?可能是因为${f}在不粘贴时被替换为转义字符串。你是对的,粘贴时它确实被替换,但我只是尝试替换${f}如果你用一个真实的URL替换downloadURL的值,那么你在回复中提供的代码会起作用。我假设${f}可以用任何名称替换,它基本上就是下载文件的名称。已经试过替换它了
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
}
);