json中的JavaScript url返回501,但字符串url不返回501

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

因此,我有以下问题:

我尝试使用CloudKit(HTTP请求)从iCloud中提取数据 iCloud实体包含一个CKAsset,我需要下载URL,POST请求将其发送到
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
}
);