Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 由于源跨源读取阻塞(CORB),JSON API无法通过fetch进行检索_Javascript_Json_Api_Fetch - Fatal编程技术网

Javascript 由于源跨源读取阻塞(CORB),JSON API无法通过fetch进行检索

Javascript 由于源跨源读取阻塞(CORB),JSON API无法通过fetch进行检索,javascript,json,api,fetch,Javascript,Json,Api,Fetch,我一直在获取设置。js:76跨源读取阻塞CORB阻塞跨源响应错误。我正在使用fetch方法从api检索json数据,下面是我的代码: function workUpdate() { let data = new FormData(); let miles = $("radius").value / 1000; let zip = ""; let cookies = document.cookie.split(";"); for (let i

我一直在获取设置。js:76跨源读取阻塞CORB阻塞跨源响应错误。我正在使用fetch方法从api检索json数据,下面是我的代码:

 function workUpdate() {
     let data = new FormData();
     let miles = $("radius").value / 1000;
     let zip = "";
     let cookies = document.cookie.split(";");
      for (let i = 0; i < cookies.length; i++) {
          let key = cookies[i].split("=");
          if (key[0].trim() == "zip") {
               zip = key[1];
          }
      }
      if (zip == "") {
          $("radius-error").innerHTML = "Please provide your zip code in the personal information tab."
      } else {
          let url = "https://www.zipcodeapi.com/rest/TrAEIfdiFRU4FNxY94su2FXgrXbCRud9mnfyWdubJSKM5Py7x0g5LjTTd46NXIo8/radius.json/" + zip + "/" + miles + "/mile";
            fetch(url, {mode:'no-cors'})
               .then(checkStatus)
               .then(JSON.parse)
               .then(handleWorkResponse)
               .catch(console.log);
      }

 }

function handleWorkResponse(response) {
     let locations = response[0]["zip_code"] + "-";
     for (let i = 1; i < response.length; i++) {
         locations += "-" + response[i]["zip_code"];
     }
     let data = new FormData();
     data.append("locations", locations);
     let url = "php/workupdate.php";
     fetch(url, {method: "POST", body: data, mode:'cors', credentials:'include'})
               .then(checkStatus)
               .then(function() {
                   location.reload();
               })
               .catch(console.log);
 }
更新: 正如KevinB在对此答案的评论中正确地指出的,这是一个第三方API。因此,无法更改服务器上的头。为了解决这个问题,一个可能的解决方案是将此请求移动到您自己的后端,即将其隐藏在到您自己的服务器的请求后面。由于同源策略不适用于服务器到服务器的请求,因此从服务器发出请求时无需设置“访问控制允许源”标题。而且,由于您的网站将向您的后端(即同一来源)发出请求,因此也不需要在此处设置“访问控制允许来源”标题

修复 与前面提到的其他人一样,这是一个服务器端问题。要解决此问题,请在给定路由的服务器响应对象中设置Access Control Allow Origin标头

如果您的服务器是使用Express创建的,您可以通过将res.header“Access-Control-Allow-Origin”和“*”添加到路由中来完成此操作。*这里允许来自任何URL的请求。为了更安全,您可以将*替换为从API获取数据的网站的URL

那是什么?
它是浏览器使用的一种安全功能,可最大限度地减少跨站点脚本编写的机会。有关它的更多信息,请阅读和。

另一种可能的解决方案是通过php文件获取api请求,然后将数据馈送给js。

访问控制允许源标题是服务器在响应时返回的内容,而不是客户端添加到请求中的内容。是,我已经读过这方面的内容,但是我是新手,我见过使用字符串“jsonp”解决这个问题的方法,但是我不知道在使用fetch方法时如何解决这个问题。服务器不是用express创建的。“在给定路由的服务器响应对象中设置Access Control Allow Origin头”是什么意思?@MaksimVengrovski在您的服务器上,您在其中编写路由器来处理php/workupdate.php路径,您需要向HTTP响应添加一个标头,服务器将该标头返回给客户端,该客户端的密钥为Access Control Allow Origin,其值为*或您网站的URL。头是附加到发送回客户端的HTTP响应的元数据;这一条特别告诉浏览器,该客户端已被API授权向其发出请求。@MaksimVengrovski它是浏览器使用的一种安全功能,用于最大限度地减少跨站点脚本编写的机会。有关它的更多信息,请点击谷歌同源policy@ColinMichaelFlaherty目标服务器是第三方服务器。建议OP向其添加标题充其量只是误导。@MaksimVengrovski实际上你无能为力。如果api未设置为允许在您发出请求的表单中发出请求,则您可能无法发出请求,或者需要找到其他方法来发出请求,例如从服务器而不是从浏览器发出请求