jQuery跨域ajax请求总是出错

1 投票
1 回答
1934 浏览
提问于 2025-04-17 15:43

我正在尝试创建一个简单的 jQuery 移动应用。我的设置如下:

  1. jQuery 客户端运行在 localhost:9090/myapp
  2. 我的服务器运行在 localhost:9010/paperboy
  3. 因为我使用的是 Windows,所以在服务器端我使用了一个简单的服务器,这个服务器是用bottle这个 Python 微框架创建的。
  4. 服务器在收到请求时返回 JSON 数据,我可以在 Chrome 或 Firefox 中清楚地看到这些数据。
  5. 我已经验证了我的响应,它是有效的 JSON。

我遇到的问题是,我希望我的客户端能够读取服务器返回的 JSON 数据。
但是由于跨域问题,它无法做到这一点。
这是我客户端的 ajax 代码:

$.ajax({
        url: "http://localhost:9010/paperboy/toi",
        type:"GET",
        data:$(this),
        dataType:"jsonp",
        //jsonp:"callback",   no support on the server

        success:function(result){
            console.log("ajax result: " + result);
        },

        error:function(e){
            console.log("Error :" + e);
        }
    });

而我的 bottle 服务器代码是:

from bottle import route, run, template, response
from paperboy import getToiNews

''' call http://localhost:9010/paperboy/toi in browser'''

@route('/paperboy/:source')
def index(source='All'):
    print "requesting news list for %s" % source
    resultJson = getToiNews()
    response.content_type = "application/javascript"
    return resultJson

run(host='localhost', port=9010)

不过在运行应用时,我最开始遇到了“ajax 源策略错误”,但在我给服务器添加了内容类型后,这个错误很快就消失了。
现在 ajax 调用没有错误,但总是调用“错误”处理程序。我尝试了各种组合,但都没有成功。有一件事我搞不明白,就是如何给我的服务器添加 jsonp 支持。
我非常感谢在这方面的任何帮助,提前谢谢大家的帮助。
谢谢。

1 个回答

4

你自己也说了,因为这是跨域请求,默认情况下是被禁止的,这就是所谓的同源策略

如果你能控制服务器(而且你确实可以),那么可以使用CORS来允许这个请求。这在任何现代浏览器上都能正常工作。(不过可惜的是,在IE8和IE9中,你需要一个jQuery的补丁来使用微软特有的XDomainRequest对象,而不是标准的XMLHttpRequest;jQuery团队拒绝把它放进库里。IE10终于在XMLHttpRequest中添加了跨域处理功能。)

另外,由于响应是JSON格式的,你也可以使用非常相似的JSON-P,它的好处是可以在所有浏览器上工作(而且不需要jQuery的补丁)。

撰写回答