json中的JavaScript网址返回501,但字符串网址未返回

时间:2020-05-27 17:06:12

标签: javascript html http icloud

所以我有以下问题:

我尝试使用CloudKit从iCloud提取数据(HTTP请求) iCloud实体包含一个CKAsset,我需要一个对https://api.apple-cloudkit.com/database/1/...的POST请求返回的下载URL。但是,如果我尝试从该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" },},} ] }

我缩短了响应,使其只包含相关内容。

我尝试使用以下代码获取网址: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从磁盘缓存中返回。我尝试以隐身模式加载该网站,但必须重新加载一次才能使其正常运行。因为每次刷新时都会收到一个新的下载ID,所以它无法缓存状态代码。

3 个答案:

答案 0 :(得分:1)

如果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;

答案 1 :(得分:1)

上面的代码确实可以将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);

答案 2 :(得分:0)

好的,所以我找到了解决方案。这和实际的URL没有关系,没关系,但是zip.js下载数据的方式。它首先发出HEAD请求,并且由于iCloud服务器不支持这些请求,因此它返回501。之所以能够使用静态域,是因为即使返回了501,它也以某种方式缓存了200 OK。

谢谢大家的帮助!