2

我正在尝试通过 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)服务器总是被“OPTIONS”请求而不是“GET”或“POST”请求击中。我从这个链接(http://engin.bzzzt.biz/2010/01/25/cross-domain-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)阅读了关于将脚本保存在标签中的信息。这对我也不起作用。有什么想法我在这里做错了吗?

4

3 回答 3

1

目前,通过 Ajax 到另一个源的唯一方法POST是服务器使用适当的CORS Allow-*标头进行响应:

Access-Control-Allow-Origin: your.origin

如果没有这样的标头,浏览器将由于Same-Origin Policy拒绝请求。

在您的第一个示例中,您似乎正在尝试使用 JSONP ( ?callback=...)。此类请求受到严格限制,GET因为它们是通过将新<script>元素附加到页面而不是通过XMLHttpRequest

<script src="http://remote.origin/resource?callback=rest.draw_table_dyn"></script>

CORS 的浏览器支持也仅限于使用XMLHttpRequest Level 2or XDomainRequest(IE8/9) 的浏览器。

除此之外,您仅限于必须创建一个在浏览器和远程服务器之间进行调解的服务器端代理。

于 2012-05-15T19:13:33.687 回答
0

可以使用 $.post 和 $.ajax 发出 POST 请求。使用 $.ajax 并为“成功”和“失败”提供函数。在“错误”函数中读取错误消息。这应该让您了解 ajax 请求失败的原因。

我的猜测是 ajax 请求返回 404 错误。

PS $.get 和 $.post 是 $.ajax 的简写版本。

于 2012-05-15T19:06:11.133 回答
0

由于同源策略,您不能对位于您的站点(不同域)之外的页面进行 ajax 调用

有一些可用的解决方法,包括使用 JSONP 作为数据类型。

于 2012-05-15T19:09:20.807 回答