Javascript jQuery、ajax和jsonp的问题
我正在使用jsonp和ajax访问另一台服务器上的web服务。以下是jQuery:Javascript jQuery、ajax和jsonp的问题,javascript,jquery,ajax,json,jsonp,Javascript,Jquery,Ajax,Json,Jsonp,我正在使用jsonp和ajax访问另一台服务器上的web服务。以下是jQuery: $.ajax({ type: 'GET', url: wsurl + 'callback=?', dataType: 'jsonp', crossDomain: true, error: function(data) { console.log('error', data); }, success: function(data) { console.log('succe
$.ajax({
type: 'GET',
url: wsurl + 'callback=?',
dataType: 'jsonp',
crossDomain: true,
error: function(data) {
console.log('error', data);
},
success: function(data) {
console.log('success', data);
},
complete: function() {
console.log('done');
}
});
问题是正在调用错误回调。它为我提供了非常有用的信息:
{
readyState: 4,
status: 200,
statusText: "success"
}
下面是我调用的json文件:
{
"id": 0,
"room_number": "0",
"first_name": "Admin",
"last_name": "Istrator",
"password": "",
"salutation": "Mr.",
"telephone": "",
"email": "",
"description": "admin",
"checkin_date": 915797106000,
"checkout_date": 4071557106000,
"last_login_date": 947333106000,
"active_status": true,
"created_date": 915797106000,
"created_by": 0,
"reference_id": ""
}
我首先尝试使用getJSON jQuery方法,得到了相同的结果。我想我会尝试基本的ajax方法,因为它有更多的控制,但是正如你所看到的,没有运气。注意到我做错了什么吗?你知道为什么它会抛出一个错误并为statusText属性提供一个成功的值吗
编辑
好的,我在ajax调用中添加了一些选项,并从url中删除了回调参数。下面是新的ajax调用:
$.ajax({
type: 'GET',
url: wsurl,
dataType: 'jsonp',
crossDomain: true,
error: function(xhr, textStatus, errorThrown) {
console.log('textStatus: ' + textStatus);
},
success: function(data) {
console.log('success');
console.log(data);
}
});
我得到了一个新的错误,我想这是好的,但仍然不起作用。不同之处在于textStatus现在是“parsererror”。控制台还在json文件的第一行抛出语法错误:
Uncaught SyntaxError: Unexpected token :
想法?不确定这是否是问题所在,但您的url不正确。根据jQuery文档,它应该自动附加?callback=?给你:
好吧,有几件事突然向我袭来:
$.ajax({
type: 'GET',
#You do not need to append the callback as you have jsonp configured it will do it
#automatically append the callback=<auto generated name>
url: wsurl,
dataType: 'jsonp',
crossDomain: true,
error: function(data) {
console.log('error', data);
},
success: function(data) {
console.log('success', data);
},
complete: function() {
console.log('done');
}
});
$.ajax({
键入:“GET”,
#您不需要追加回调,因为您已经配置了jsonp,它将完成此操作
#自动追加回调=
url:wsurl,
数据类型:“jsonp”,
跨域:是的,
错误:函数(数据){
console.log('错误',数据);
},
成功:功能(数据){
console.log('success',数据);
},
完成:函数(){
console.log('done');
}
});
此外,您的返回似乎没有包装在jsonp工作所需的函数中
<auto generated name>({ json object })
({json object})
回调函数将由jquery自动命名。因此,您需要一个服务,该服务将接收回调参数并返回一个带填充的json对象。从URL中删除回调,并尝试用类似的内容包装json(php示例,$\u GET['callback']由jQuery自动设置):
我觉得一切都很好,如果这能让我感到安慰的话。。。您是否可以在JSFIDLE上设置一个示例?服务器是否配置为处理JSONP类型的请求?应该是。至少,服务器端的家伙说是这样。我创建了一个示例说明,使用不同的错误函数,您可能需要将空数据作为`数据:{}传递,并在其中添加一个contentType:以及修复其他人注意到的url问题。如果我去掉最后的问号,我遇到了access control allow origin协议问题。如果您只是对url执行此操作--url:wsurl如果不是那样,请尝试在开头添加问号,就像这样--url:wsurl+?callback=?确实如此,您是对的。我认为它需要它,因为$.getJSON需要它来知道我想要jsonp。但结果没有变化。您确定服务器希望调用回调参数吗?它是像jsonp_回调之类的东西吗?在这种情况下,您需要将jsonp属性设置为他们期望的回调参数的名称:jsonp:“callback_name”不能,我没有访问json的权限。这将是一个问题。返回的jsonp格式不正确。它必须包装成jsonp,因为jquery需要它。查看本教程:我从url中删除了回调,但我不确定在函数中包装返回是什么意思。你是说除了错误、成功和完全回调之外的函数吗?jsonp的要点是不允许从跨域返回json对象,但当包装在函数中时,它是允许的。先生,您应该多读一些,非常正确,谢谢您提供的信息。现在工作出色。:)很高兴这有帮助。当我第一次开始使用jquery时,我也陷入了这个困境。
$_GET['callback'] . '({
"id": 0,
"room_number": "0",
"first_name": "Admin",
"last_name": "Istrator",
"password": "",
"salutation": "Mr.",
"telephone": "",
"email": "",
"description": "admin",
"checkin_date": 915797106000,
"checkout_date": 4071557106000,
"last_login_date": 947333106000,
"active_status": true,
"created_date": 915797106000,
"created_by": 0,
"reference_id": ""
})'