1

我正在尝试一个简单的 jquery ajax 调用来获取 json 数据。但是,通话失败,我不能很好地理解为什么。

代码如下。对我来说,这似乎没问题。

$(document).ready(function() {

    function onDataReceived (data){
        alert('test');
    };

    $("button").click(function(){
        $.ajax({
            url: "/test",
            type: "GET",
            dataType: "jsonp",
            success: onDataReceived
        }); 
    });
});

编辑烧瓶使用

这里的问题是我正在使用 Flask 并返回一个 json 对象。但是,一旦您尝试使用 jquery 进行 ajax 调用,返回纯 json 会产生跨域冲突。因此,如果您从烧瓶视图输出 jsonp 会容易得多。为此,您可以使用下面的代码片段(来自这里: http: //flask.pocoo.org/snippets/79/)。javascript部分可以参考上面的,我只是把dataType从json改成了jsonp。

import json
from functools import wraps
from flask import redirect, request, current_app

def support_jsonp(f): 
"""Wraps JSONified output for JSONP"""
@wraps(f)
 def decorated_function(*args, **kwargs):
  callback = request.args.get('callback', False)
  if callback:
   content = str(callback) + '(' + str(f().data) + ')'
   return current_app.response_class(content, mimetype='application/json')
  else:
   return f(*args, **kwargs)
  return decorated_function

# then in your view
@default.route('/test', methods=['GET'])
@support_jsonp
def test():
 return jsonify({"foo":"bar"})

我不确定是否有办法使用烧瓶中的直接 json,可能有。但是,由于 jsonp 也更安全,所以我认为最好还是这样做。

4

1 回答 1

2

这不起作用,因为远程脚本返回 JSON,而不是 JSONP。为了能够执行跨域 AJAX 调用,远程服务器需要支持 CORS 或 JSONP。联系您尝试使用的远程 API 的作者,或阅读文档以了解它是否支持它。

您在请求中指定的事实dataType: "jsonp"使 jQuery 向callback远程域发送一个查询字符串参数,期望它将响应包装在其中。如果不支持,则远程域不支持 JSONP,或者回调参数的调用方式不同。

于 2013-04-22T06:19:40.837 回答