Jquery跨域ajax请求始终出错

时间:2013-02-13 08:38:46

标签: python ajax json jquery bottle

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

  1. jQuery客户端正在 localhost:9090 / myapp 上运行。
  2. 我的服务器正在 localhost:9010 / paperboy
  3. 上运行
  4. 由于我在Windows上,在服务器端,我使用的是一个简单的服务器,使用“ bottle ”创建,这是一个python微框架。
  5. 服务器根据请求返回json,我可以在Chrome或Firefox中清楚地看到。
  6. 我已经验证了我的回复,它是一个有效的JSON。
  7. 我面临的问题是,我希望我的客户端从服务器响应中读取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);
            }
        });
    

    我的瓶子服务器代码是:

    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 origin policy error”,一旦我将内容类型添加到我的服务器,很快就会消失。
    现在ajax调用没有错误,但总是调用“错误”处理程序。我尝试了各种组合,但都是徒劳的。我无法弄清楚的一件事是向我的服务器添加jsonp支持 我感谢您对此事的任何帮助,并提前感谢您的帮助 感谢。

1 个答案:

答案 0 :(得分:4)

你自己说过,因为它是一个跨源调用,默认情况下它被SOP禁止。

如果您控制服务器(并且您是),则可以使用CORS来允许该请求。这适用于任何现代浏览器。 (虽然不幸的是在IE8和IE9的情况下,你需要一个jQuery补丁来支持使用特定于Microsoft的XDomainRequest对象而不是标准XMLHttpRequest; jQuery团队拒绝将其放入IE10最终将跨域处理添加到XMLHttpRequest。)

或者,由于响应是JSON,您可以使用非常相似的JSON-P,这样可以使用所有浏览器(并且没有jQuery补丁)。