我正在尝试通过ajax向另一个域发送发布请求并获得json响应。服务器位于我公司内部,通过日志,我可以看到它正在发送带有 json 的响应。
以下是我的尝试示例:
1(
function makeRequest(strURL){
$.get(strURL+"?callback=rest.draw_table_dyn", "{}",
function(resp){
rest.draw_table_dyn(resp);
});
}
2(
xmlhttpPost : function(strURL) {
var xmlHttpReq = false;
var self = this;
if (window.XMLHttpRequest) {
self.xmlHttpReq = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
self.xmlHttpReq.open('POST', strURL, true);
self.xmlHttpReq.setRequestHeader("Content-Type", "application/json");
self.xmlHttpReq.onreadystatechange = function() {
rest.draw_table_dyn(self.xmlHttpReq.responseText);
}
self.xmlHttpReq.send(null);
}
但是,以下是我遇到的问题:
1(服务器总是被"选项"请求而不是"GET"或"POST"请求击中。我从这个链接(http://engin.bzzzt.biz/2010/01/25/cross-域-xhr-access-control-preflight/(了解到,根据标准,这是一个预检请求。
但是我可以提出 POST 请求吗?我尝试使用$.post,$.ajax甚至$.get,但无济于事。
2( 响应数据为空。我需要数据来填充页面中的项目。有没有办法读取 json?目前我只得到一个返回状态为 0 的空字符串。
我尝试了xmlHttpRequest,$.ajax,$.get和$.post来发送请求并接收json,但无济于事。
我在这里读到(http://stackoverflow.com/questions/4221458/how-to-make-a-jsonp-call-to-an-api-using-jquery(关于将脚本保留在标签中。这对我也不起作用。知道我在这里做错了什么吗?
目前,通过 Ajax POST
到另一个源的唯一方法是服务器使用适当的 CORS Allow-*
标头进行响应:
Access-Control-Allow-Origin: your.origin
如果没有这样的标头,由于同源策略,浏览器将拒绝请求。
在您的第一个示例中,您似乎正在尝试使用 JSONP (
提出的:?callback=...
(。此类请求严格限于GET
,因为它们是通过将新的<script>
元素附加到页面而不是通过XMLHttpRequest
<script src="http://remote.origin/resource?callback=rest.draw_table_dyn"></script>
CORS在浏览器支持方面也仅限于具有XMLHttpRequest Level 2
或XDomainRequest
(IE8/9(的浏览器。
除此之外,您只能创建一个在浏览器和远程服务器之间进行调解的服务器端代理。
$.post和$.ajax发出POST请求。使用 $.ajax 并提供"成功"和"失败"函数。在"错误"功能中,读取错误消息。这应该让您了解 ajax 请求失败的原因。
我的猜测是 ajax 请求返回 404 错误。
P.S. $.get 和 $.post 是 $.ajax 的简写版本。
由于同源策略,您无法对位于站点(不同域(之外的页面进行 ajax 调用
有一些解决方法可用,包括使用 JSONP 作为数据类型。