我有一个函数可以在我的Django
网站上获取邮政编码信息。 问题是,除了一个页面之外,这个功能在所有页面中都能完美工作。 我对所有的页面都使用了相同的页眉。
var HttpClient = function () {
this.get = function (aUrl, aCallback) {
var anHttpRequest = new XMLHttpRequest();
anHttpRequest.onreadystatechange = function () {
if (anHttpRequest.readyState == 4 && anHttpRequest.status == 200)
aCallback(anHttpRequest.responseText);
}
anHttpRequest.open("GET", aUrl, true);
anHttpRequest.send(null);
}
}
function getZipCode(obj) {
var client = new HttpClient();
client.get("http://viacep.com.br/ws/" + obj.value + "/json/", function (response) {
console.log(response_json)
//more code...
})
}
在有问题的页面中,我得到了著名的“请求的资源上没有'Access-Control-Allow-Origin'头”。 错误。 我对此研究了很多,但当这个问题只出现在一页纸上时,却找不到一个正确的解决方法。 我怎样才能使这个工作在所有的页面?
从根本上说:如果您在A页上没有得到错误,而在B页上得到了错误,那么:
>
页A和页B的来源不同。 它们的方案不同(例如http
与https
),它们的主机名不同(记住example.com
和www.example.com
是不同的主机名,导致不同的来源),或者它们的端口不同。
位于viacep.com.br
的目标系统根据自己的规则主动决定是否允许跨源调用,并选择不允许来自页面B的URL的调用(不发回必要的头),即使它允许来自同一源上的其他页面的调用。 这是一个系统可以做到的,但实际上很少做到。
那么,假设第一,同一站点中的B页有什么不同呢? 它可能是:
>
如果有问题的页面在http
上,而所有其他页面在https
上,或者反之亦然,并且源允许来自其中一个而不是另一个的跨源调用,则
。
如果您的页面位于viacep.com.br
上,而唯一有问题的页面位于https
上。 您正在进行的调用是对http://viacep.com.br
的调用,因此http://viacep.com.br
上的其他页面是相同来源的(但https://viacep.com.br
上的页面是交叉来源的)。
(正如charlietfl指出的)出现问题的页面使用了不同的主机名,可能是子域或类似的名称。