使用JQuery Ajax和JSONP调用OData服务

时间:2014-05-05 20:56:48

标签: jquery ajax jsonp odata asp.net-web-api

我正在尝试使用JQuery $ .ajax调用OData服务并遇到一些问题。

当我使用dataType:“jsonp”调用服务时,我得到一个200的状态代码和我需要的数据,但它属于我的JQuery错误:函数(数据)

当我使用dataType:“json”调用服务时,我什么都没得到,甚至没有发生对服务的调用。

这是我的.ajax电话:
     $.ajax({ beforeSend: function(request) { request.setRequestHeader("Accept", "application/json;charset=utf-8"); }, type: "GET", url: this.uri + filter, dataType: "jsonp", success: function(data) { // I never get here but in fiddler I get a 200 status code }, error: function(data) { // This works and gives me the data but it's in the JQuery error handler // $.parseJSON(data.responseText) } });
我尝试了几种变体“jsonp:false”,“callback”等,但没有成功。我还要提一下,网站和odata webapi在同一台服务器上,但网站是通过https访问的,然后客户端ajax通过http调用该服务。

有人能告诉我哪里出错了吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可能正在调用已支持CORS的OData服务。这意味着您不需要在请求中指定使用JSONP。如果您获得的状态代码为200的响应有一个标题" Access-Control-Allow-Origin:xxx",您可能正在谈论此类服务。

尝试使用以下ajax调用:

$.ajax({
        type: "get",
        async: false,
        url: "http://services.odata.org/V4/OData/OData.svc/Products",
        success: function (data) {
            alert(JSON.stringify(data));
        },
        error: function (xhr, textStatus, errorMessage) {
            alert(errorMessage);
        }
    });

您可以在警报窗口中看到数据。

答案 1 :(得分:1)

经过无数个小时的努力,我终于通过跳过JQuery并使用xmlhttprequest对象来实现它,这是我的工作代码:

var uri = this.uri + filter;

var http_request = new XMLHttpRequest();
http_request.setRequestHeader("Authorization", "Negotiate");

http_request.onreadystatechange  = function() {
    if (http_request.readyState == 4  ) {
        var data = JSON.parse(http_request.responseText);
        alert(data.value[0].Name);
    }
}

http_request.open("GET", uri, true);
http_request.send();    

var http_request = new XMLHttpRequest(); http_request.setRequestHeader("Authorization", "Negotiate"); http_request.onreadystatechange = function() { if (http_request.readyState == 4 ) { var data = JSON.parse(http_request.responseText); alert(data.value[0].Name); } } http_request.open("GET", uri, true); http_request.send();

我从网上的各个地方借来的东西,所以其他人值得信任。

这仅适用于运行IE的本地Intranet,如果有人有其他建议我可以尝试或更好的方式这样做我将非常感谢您的反馈。

谢谢!