使用 JQuery Ajax 和 JSONP 调用 OData 服务

Posted

技术标签:

【中文标题】使用 JQuery Ajax 和 JSONP 调用 OData 服务【英文标题】:Call OData Service using JQuery Ajax and JSONP 【发布时间】:2014-06-22 07:13:15 【问题描述】:

我正在尝试使用 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 调用服务。

谁能告诉我哪里出错了?

提前致谢!

【问题讨论】:

【参考方案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);
        
    );

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

【讨论】:

我尝试了您的建议并收到错误消息“访问被拒绝”。我正在使用所有最新的库运行 VS2013。 System.Web.Http.Odata 5.1.0.0、MVC 5.1.0.0 等。看起来好像 JQuery jsonp 调用有效,但由于 OData 服务不知道如何返回填充响应而只返回 json。当 JQuery 收到该响应时,它期待一个填充响应并且不知道如何处理它,因此它被发送到错误处理程序。我是如此接近,但只是错过了一些东西。谢谢! 好吧不得不轻笑一下,这对我不起作用,我猜你没有阅读我的全部回复。我在工作中一直在做同样的事情:)【参考方案2】:

经过无数小时的努力,我终于通过跳过 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();    

我从网络上的任何地方借来了一些东西,所以其他人值得称赞。

这仅用于运行 IE 的本地 Intranet,如果有人有其他建议我可以尝试或更好的方法,我将不胜感激您的反馈。 谢谢!

【讨论】:

以上是关于使用 JQuery Ajax 和 JSONP 调用 OData 服务的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 中止 JSONP ajax 请求

使用 Jsonp 进行 $.ajax 调用后无法在 Jquery 中检索数据

处理跨域 jsonp 调用的 jQuery.ajax 错误

如何在 jQuery ajax 调用中将 JSON 响应解析为 JSONP?

使用 JSONP 和 JQuery 调用 REST Api

jquery ajax使用JSONP解决跨域问题