我试图有一个简单的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就会产生跨域冲突。因此,如果从flask视图中输出json,就容易多了。为此,您可以使用下面的代码片段(从这里:http://flask.pocoo.org/snippets/79/)。对于javascript部分,您可以参考上面的部分,我只是将数据类型从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"})
我不确定是否有一种方法可以从flask直接使用json,可能有。然而,由于json也更安全,我认为最好还是这样做。
这不起作用,因为远程脚本返回JSON,而不是JSONP。为了能够执行跨域AJAX调用,远程服务器需要支持CORS或JSONP。请联系您尝试使用的远程API的作者,或者阅读文档以了解它是否支持该API。
事实上,你指定的dataType: "jsonp"
在你的请求使jQuery发送一个callback
查询字符串参数到远程域期望它包装在其中的响应。如果不支持,则远程域不支持JSONP,或者调用回调参数的方式不同。