【问题标题】:Make $.ajax call to url without knowing dataType在不知道 dataType 的情况下对 url 进行 $.ajax 调用
【发布时间】:2014-03-05 20:31:52
【问题描述】:

我正在尝试使用 jquery $.ajax 设置对 Web 服务的通用调用。我希望能够取回原始数据并将其绑定到网格。

当我知道数据类型时,我的调用工作正常,但我想尝试在不知道数据类型的情况下进行 ajax 调用,特别是查找数据类型是什么。

例如,我知道数据类型的 ajax 调用可能是:

$.ajax({
    type: 'GET',
    crossDomain: true,
    dataType: "jsonp",
    url: 'http://itunes.apple.com/search?term=coldplay',
    success: function (res, status, xhr) {
        //DoStuff;
    },
    error: function (jqXHR, textStatus, errorThrown) {
        //DoStuff
    }
});

但每当我在不知道数据类型的情况下发出请求时,我只会得到“错误”的响应状态?

我最终希望能够对此执行的操作是 ping 一个返回 json、xml 或者可能是 odata(不太可能)的 url(webservice)。因为我不知道是哪个,所以我希望能够简单地调用 url 一次以找出我可能会返回什么样的数据,以及有什么内容类型。

我尝试过简单地取回错误标头中的内容类型,但到目前为止,我尝试过的任何方法都没有奏效或根本没有返回任何内容。

$.ajax({
    type: 'GET',
    crossDomain: true,
    url: 'http://itunes.apple.com/search?term=coldplay',
    success: function (res, status, xhr) {
        //DoStuff
    },
    error: function (jqXHR, textStatus, errorThrown) {
        $("#results").html(textStatus + jqXHR.getResponseHeader('Content-Type'));
    }
});

这甚至可以用 Jquery 完成吗?

编辑

我知道这可以(并且在大多数情况下应该)在服务器端完成,而且很可能这就是最终会发生的事情。但是为了了解在不知道我的 dataType 的情况下我可以将网格绑定到数据源客户端多远,上面的问题就诞生了。

感谢大家的时间。

【问题讨论】:

  • 你为什么不知道数据类型?如果有的话,您的请求应该指明您想要返回的数据类型。
  • 示例:我的网站只是使用数据并为用户显示/排序。我从 Web 服务获取数据,该 Web 服务可能返回 xml 或 json。我真的不在乎哪个,我只需要显示它。只是好奇是否有可能。
  • 如果您更改服务以返回 content-type 以及数据会怎样。 { contentType: 'json', data: [] }
  • 如果我能控制服务就好了,但这假设我没有。
  • 在您的服务器上创建一个“代理”脚本来为您进行抓取,并以您想要显示的格式返回。

标签: javascript jquery ajax json web-services


【解决方案1】:

您的方法是合理的,但您要求用户的浏览器从第三方网络服务器获取信息。

XMLHttpRequest 无法加载 http://itunes.apple.com/search?term=coldplay。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'http://fiddle.jshell.net'。

除非第三方授予您权限,否则Same Origin Policy 将阻止您的 JavaScript 访问有关响应的任何信息。

你应该移动你的逻辑服务器端。

【讨论】:

  • 当我将 contenttype 放入 ajax 调用中时,这已成功使用并且我可以显示结果,所以我不确定你的意思。我也用 fiddler 访问这个?
  • @Malcoda — 不。当您告诉 jQuery 使用 JSON-P 时,它会发出 JSON-P 请求而不是 XHR 请求。 JSON-P 不受同源策略的约束(因为它不会导致您编写的 JS 访问另一台服务器的数据,而是添加来自另一台服务器的脚本来调用您的代码(即相反))。它仅在服务器支持 JSON-P 时才有效(这是本答案倒数第二段中提到的授予权限的一种方式)。
  • (如果它确实支持 JSON-P,那么响应将被编码为 JSON-P 而不是 JSON、XML 或 odata)
  • 啊……明白了。那么这是否意味着 jquery 请求将无法访问 xml 甚至 json 响应? xml 是否有 jsonp 的等价物?
  • Web 服务与托管脚本的页面共享同一来源,或者返回 CORS 规范中描述的标头。
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 2018-08-20
  • 2021-09-26
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
相关资源
最近更新 更多