【问题标题】:Call OData Service using JQuery Ajax and JSONP使用 JQuery Ajax 和 JSONP 调用 OData 服务
【发布时间】: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 调用服务。

谁能告诉我哪里出错了?

提前致谢!

【问题讨论】:

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


    【解决方案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,如果有人有其他建议我可以尝试或更好的方法,我将不胜感激您的反馈。

    谢谢!

    【讨论】:

      猜你喜欢
      • 2015-01-03
      • 2013-04-18
      • 1970-01-01
      • 2013-05-10
      • 2012-02-11
      • 2010-10-18
      • 2015-04-27
      • 2014-07-08
      相关资源
      最近更新 更多