Javascript 跨域XHR
嗨,我面临一个奇怪的问题。我需要使用来自不同领域的webservice。所以我研究了chrome插件SimpleREST客户端的代码,发现他们正在使用这个函数来生成XHRJavascript 跨域XHR,javascript,xmlhttprequest,cross-domain,Javascript,Xmlhttprequest,Cross Domain,嗨,我面临一个奇怪的问题。我需要使用来自不同领域的webservice。所以我研究了chrome插件SimpleREST客户端的代码,发现他们正在使用这个函数来生成XHR function sendRequest() { clearFields(); if ($("#url").val() != "") { var a = new XMLHttpRequest; a.onreadystatechange = readResponse; try { a.op
function sendRequest() {
clearFields();
if ($("#url").val() != "") {
var a = new XMLHttpRequest;
a.onreadystatechange = readResponse;
try {
a.open($("input[type=radio]:checked").val(), $("#url").val(), true);
//This code is for adding headers
var b = $("#headers").val();
b = b.split("\n");
for (var c = 0; c < b.length; c++) {
var d = b[c].split(": ");
d[1] && a.setRequestHeader(d[0], d[1])
}
jQuery.inArray($("input[type=radio]:checked").val(), ["post", "put"]) > -1 ? a.send($("#postputdata").val()) : a.send("")
} catch (e) {
console.log(e);
$("#responsePrint").css("display", "")
}
} else {
console.log("no uri");
}
}
但是使用我的代码,我得到的XMLHttpRequest无法加载http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy. 起源http://localhost:51582 访问控制允许源站不允许使用。
那么问题出在哪里呢?为什么以前的代码有效,而我的代码却几乎不一样
编辑:
我还尝试使用此函数调用hte webservice
$.ajax({
type: "GET",
url: "http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy",
contentType: "script; charset=utf-8",
dataType: "jsonp",
success: function (msg) {
var tes = $(msg);
},
error: function (xhr, status, err) {
}
});
我想做的是将响应读取为DOM,因为webservice返回整个HTML页面,我只需要一个div,但现在我得到了
未捕获的SyntaxError:uncontracted token,这让您无法执行。因此出现了错误http://localhost:51582 访问控制允许源站不允许。浏览器加载项/扩展以不同的权限在与常规网页不同的环境中运行。我怀疑你的代码应该能工作,如果做成一个插件。它只是不能像普通网页那样工作
从CORS到代理都有解决此问题的方法。在这里或谷歌搜索“跨域ajax”。正如其他人所指出的,这是由于的原因。这是由浏览器强制执行的,这意味着附加组件可以绕过此限制。这应该能回答你最初的问题
如何避开这个问题?有很多种方法,但大多数都需要服务器的某种合作。人们已经在这里提到了一些解决方法,显然您尝试了JSONP路径,但出现了错误
你为什么会出错?因为脚本希望得到JSONP格式的响应,但它没有得到:它得到了一个HTML响应。我认为这种方法在您的情况下不起作用,因为服务器肯定不是为此而设计的
现在真正的问题是:你为什么要这样做?根据你的回答,我可以想出几种解决办法
例如,如果您需要访问该页面中显示在网站上的信息,我认为最简单的解决方案是使用代理(有关更多信息,请参阅)
如果您只是出于个人目的在自己的计算机上使用此功能,则在某些浏览器中可以专门禁用同源策略检查
例如,在Chrome中,使用以下选项运行它可以做到这一点:(警告:不支持!安全性肯定会受到影响)
如果执行此操作(禁用浏览器的安全检查),即使是一个简单的:
$.get("http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy", function(data) {
console.log(data);
},'html');
可以正常工作。从运行时原始代码是否正常工作?可能是的副本,但如何从REST客户端(它是浏览器的附加组件,因此从我的IP运行)正常工作?如果真的如你所说,有没有办法让它发挥作用?因为当我尝试使用jQuery和get()以及参数jsonp时,它起了作用,但在这种情况下,如果jQuery支持jsonp而不是发出jsonp请求,我就不能使用jQuery。我尝试按照邹的建议使用jsonp,但我遇到了另一个错误,正如我在edit中所描述的那样
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
chrome --disable-web-security
$.get("http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy", function(data) {
console.log(data);
},'html');