Javascript 由于源跨源读取阻塞(CORB),JSON API无法通过fetch进行检索
我一直在获取设置。js:76跨源读取阻塞CORB阻塞跨源响应错误。我正在使用fetch方法从api检索json数据,下面是我的代码: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
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未设置为允许在您发出请求的表单中发出请求,则您可能无法发出请求,或者需要找到其他方法来发出请求,例如从服务器而不是从浏览器发出请求