我正在编写一个jQuery接口来使用在SAP中创建的几个OData服务。这些服务运行正常,并且还被其他一些应用程序使用。
我已经搜索过,而且我经常遇到那些说这是跨领域问题的人。我尝试的第一件事就是简单地做一个跨域的ajax调用:
$.ajax({
url : 'http://saphostname:8000/sap/opu/odata/sap/entityset/?$format=json',
crossDomain : true,
xhrFields {
withCredentials : true,
}
// .. success, statusCodes, whatever ..
})
来自此调用的响应为200,如果我查看开发人员工具中的内容,我会看到我的json消息,因为我希望它在那里,但我的回调函数都没有被触发。
在搜索更多内容时,有人建议使用$.getJSON()
。这也不起作用。不断回来的错误是401,所以我认为这是一个跨域问题。
我偶然发现的最后一件事是JSONP
。响应将返回OK状态代码,如果我查看正文内容,我会再次看到我的json字符串。唯一的问题是我的浏览器说响应文本中存在语法错误。
我的所有搜索结果都提出了有关跨域请求以及由此导致的错误的问题。也许这是问题所在,但是因为我得到了我期望在回复中得到的结果,我不得不假设连接没有问题。
tl; dr:ajax跨域请求成功但不触发回调函数,jsonp给我一个语法错误。我不知道在哪里继续寻找。
答案 0 :(得分:1)
您正在尝试向JSON服务执行JSONP请求。为JSONP请求处理响应的方式是执行它,但执行JSON响应只会对其进行评估并将其丢弃。
crossDomain
属性只会导致请求的行为类似于跨域请求,即使用JSONP,无论它是否实际上是在不同的域中。
您应该在属性中指定dataType: 'json'
,以防止它使用JSONP。
或者,如果该服务还支持JSONP
,您可以将网址中的$format=json
更改为$format=jsonp
,并在属性中指定dataType: 'jsonp'
。
您可以尝试的另一件事是使用将JSONP请求转换为JSON请求的代理。我已经设置了这样一个代理,你可以用来测试你是否能得到正确的答案:
$.get(
"http://jsonp.guffa.com/Proxy.ashx?url=" + escapeURIComponent("saphostname:8000/sap/opu/odata/sap/entityset/?$format=json"),
function(data) {
console.log(data);
},
"jsonp"
);
答案 1 :(得分:0)
我以前遇到过这样的问题,帮助我解决问题的是使用这样的回调:
// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax( "example.php" )
.done(function() {
alert( "success" );
})
.fail(function() {
alert( "error" );
})
.always(function() {
alert( "complete" );
});
// Perform other work here ...
// Set another completion function for the request above
jqxhr.always(function() {
alert( "second complete" );
});
现在您可以看到正在触发哪一个并调试问题。