在尝试使用带有ajax和jquery的stackoverflow api时,我无法让它工作。我知道我必须使用jsonp
作为数据类型,并且我一直在阅读执行jsonp请求的不同方法,但我仍然无法使其工作。
这是我的ajax请求:
var API_KEY = "XXXXXXXXXXXX";
var URL = "http://api.stackoverflow.com/1.1/";
var _url = URL + 'users?filter=locrizak';
$.ajax({
dataType:'jsonp',
jsonp : false,
jsonpCallback : "onJsonp",
url: _url,
success: function(val) {
console.log('success');
//console.log(val);
},
error: function(val) {
console.log('error');
console.log(arguments);
}
});
function onJsonp() {
console.log(arguments);
};
无论我尝试什么,我总是在萤火虫中得到这个回应:
"parsererror" "onJsonp was not called"
我知道我正在做一些非常愚蠢的事情,因为我在尝试使用Twitter api时遇到了同样的问题,但我不能为我的生活记住我为了让它工作而做的事情。
所以我采取了一个loog @ genesis的工作演示并尝试了几次不同的方式,但没有运气。然后我注意到我的jQuery版本并将其切换到他正在使用的版本并且神奇地工作。
我更改了最新版本
http://code.jquery.com/jquery-1.6.2.min.js
至
http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js
嗯,不知道它为什么会起作用,可能是一个错误,但是谁知道其他可能发生了变化。
如果你能解释的话,如果有人知道为什么它会很棒。此外,我意识到jQuery会自动添加回调,但我无法让它像那样工作。我能做些什么才能让这个工作,我想你会说“更合适”的方式?
var URL = "http://api.stackoverflow.com/1.1/";
api.get(URL + 'users?filter=locrizak');
api.get = function(url) {
$.ajax({
/*dataType:'jsonp',*/
dataType:'json',
jsonp : false,
url: url + '&jsonp=api.onJsonp',
success: function(val) {
console.log('success');
//console.log(val);
},
error: function(val) {
//error gets called but.......
console.log(arguments);
console.log('error');
console.log(val);
}
});
};
api.onJsonp = function() {
//so does the callback!!
console.log('called');
console.log(arguments);
}
//note this code is simplified
答案 0 :(得分:2)
你必须致电
http://api.stackoverflow.com/1.1/users?filter=locrizak&jsonp=jsonp
working demo和代码:
<script>
var URL = "http://api.stackoverflow.com/1.1/";
var api;
api = {
get: function(url) {
$.ajax({
dataType: 'json',
jsonp: false,
jsonpCallback: 'api.onJsonp',
url: url + '&jsonp=api.onJsonp',
});
},
onJsonp: function(val) {
$("body").prepend(val.users[0].reputation);
console.log('called');
}
}
api.get(URL + 'users?filter=locrizak');
//note this code is simplified</script>
答案 1 :(得分:1)
onJsonp是否在闭包中定义?如果是这样,也许您通过名称('onJsonp')而不是引用引用回调的事实是问题?
两个解决方案:在全局范围内定义onJsonp,或通过删除引号将其作为引用传递。
答案 2 :(得分:1)
您可以将jsonp:'jsonp',
添加到ajax()
来电。 stackoverflow API documentation表示需要jsonp
查询参数和jQuery属性来配置传递的查询字符串参数,称为jsonp
。没有它,默认设置是将callback=?
添加到URL的末尾。
我在控制台中获得success
,运行此命令:
var URL = "http://api.stackoverflow.com/1.1/";
var _url = URL + 'users?filter=locrizak';
$.ajax({
dataType: 'jsonp',
jsonp: 'jsonp', // <--- add this
url: _url,
success: function(val) {
console.log('success');
},
error: function(val) {
console.log('error');
console.log(arguments);
}
});
此外,jsonp:false,
不应设置为false
;它必须是true
,否则不会添加查询字符串参数。
更新:使用jQuery v1.6.2正确使用并使用上面原始答案中所述的正确参数。回调函数必须在jQuery匿名函数之外。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>JSONP Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
$.ajax({
dataType:'jsonp',
jsonp: 'jsonp',
jsonpCallback: 'onJsonp',
url: 'http://api.stackoverflow.com/1.1/users?filter=locrizak',
success: function(data) {
console.log('success', data);
},
error: function(data) {
console.log('error', data);
}
});
});
function onJsonp(data) {
console.log('callback', data);
};
</script>
</head><body></body></html>
更新2:根据评论,这是另一个版本,这次包装在一个对象中。请注意,您不能使用jsonpCallback: 'api.onJsonp',
,因为它只在jQuery匿名函数中定义。保持封装的最简单方法是创建一个全局函数,并将控制权传递回api
对应物。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>JSONP Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
api = {
get: function(url) {
var URL = "http://api.stackoverflow.com/1.1/";
$.ajax({
dataType: 'jsonp',
jsonp: 'jsonp',
jsonpCallback: 'onJsonp',
url: URL + url,
success: function(data) {
console.log('success', data);
},
error: function(data) {
console.log('error', data);
}
});
},
onJsonp: function(data) {
console.log('callback', data);
}
}
api.get('users?filter=locrizak');
});
function onJsonp(data) {
api.onJsonp(data);
}
</script>
</head><body></body></html>
答案 3 :(得分:0)
$.ajax({
dataType:'jsonp',
jsonp : true,
jsonpCallback : "onJsonp",
url: _url,
success: function(val) {
console.log('success');
//console.log(val);
},
error: function(val) {
console.log('error');
console.log(arguments);
}
});
将jsonp设置为true。