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

Posted

技术标签:

【中文标题】json 中的 JavaScript url 返回 501 但字符串 url 不返回【英文标题】:JavaScript url in json returns 501 but string url does not 【发布时间】:2020-05-27 17:06:12 【问题描述】:

所以我有以下问题:

我尝试使用 CloudKit(HTTP 请求)从 iCloud 提取数据 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" ,, ] 

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

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

【问题讨论】:

【参考方案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;

【讨论】:

$f 可以替换为任何名称,它本质上只是下载文件的名称。已经尝试使用 .replace() 将其替换为其他内容。网络选项卡仅显示 501 Not Implemented。我刚刚发现的是确实返回 501 的 HEAD 请求(我使用 paw 来测试 http 请求)但是为什么我手动实现的 URL 可以工作? 可能是因为$f在不粘贴时被转义字符串替换了 你说得对,粘贴时它确实会被替换,但我只是尝试用其他东西替换 $f 并将 $f 添加到粘贴的 url 顺便说一句,如果您将 downloadURL 的值替换为真实的 URL,则您在响应中提供的代码有效。 我也这么认为【参考方案2】:

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

【讨论】:

我确定数据包含信息,因为我能够将 downloadURL 打印到控制台。我刚刚尝试了对象表示法,它也不起作用...... 你能在你正在解析的地方添加代码,然后使用 URL 来获取数据吗? 好的,我把它加到原帖里了【参考方案3】:

好的,我找到了解决方案。这与实际的 URL 无关,很好,而是 zip.js 下载数据的方式。它首先发出 HEAD 请求,因为 iCloud 服务器不支持这些请求,所以它返回 501。静态域工作,因为它以某种方式缓存了 200 OK,即使返回了 501。

感谢大家的帮助!

【讨论】:

以上是关于json 中的 JavaScript url 返回 501 但字符串 url 不返回的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript学习(八十)—请写一段JS程序提取URL中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中

json站点地图中的Javascript部分通配符匹配

从 Javascript 中的 url 获取 JSON 文件,React Native

php请求url返回json数据的问题

用于打开 json 提要中的所有 url 的 Javascript window.open 函数

使用 JSON 使用 Javascript 缩短 URL