2

我正在尝试使用此问题中的 Web 服务来验证提要。

但是浏览器不允许我向另一台服务器发送 ajax GET 请求。并且该 Web 服务中的每个请求都有一秒钟的限制,因此我无法镜像来自服务器的请求。

这是我当前的 jQuery 代码:

var reqUrl = "http://validator.w3.org/feed/check.cgi?url=" + encodeURIComponent(theUrl);
$.get(reqUrl, function(data) {
    // do something
});

难道没有别的办法了吗?

4

4 回答 4

2

我搜索了谷歌并找到了这个。第三个答案说:

在计算中,同源策略是许多浏览器端编程语言(例如 JavaScript)的重要安全概念。该策略允许在源自同一站点的页面上运行的脚本无特定限制地访问彼此的方法和属性,但禁止跨不同站点的页面访问大多数方法和属性。(来源)

你最好看看这个问题的答案。

我认为您不能使用 JSONP,因为您无法访问 W3C 脚本。

更新(说明)

我链接到的问题还有另一种方式可以向您解释。如果您将Access-Control-Allow-Origin标头设置*为答案,您可以将请求发送到另一个域。并在 MVC 应用程序中轻松使用它,您可以看到这个解决方案。祝你好运

更新2

只允许http://validator.w3.org/你应该设置Access-Control-Allow-Originhttp://validator.w3.org/

有关答案的更多详细信息,请转到此处

于 2012-08-17T00:28:18.277 回答
2

除非您使用JSONP,否则 Ajax 调用在不同域之间无效。JQuery-ajax-cross-domain是一个类似的问题,可能会给您一些见解。此外,正如 Luis 在评论中所指出的,JSONP 也必须在您从中获取数据的域上实现。

这是 jquery ajax() 的示例,但您可能需要查看$.getJSON()

$.ajax({
    url: 'http://yourUrl?callback=?',
    dataType: 'jsonp',
    success: processJSON
});

另一个选项是CORS(跨源资源共享),但是,这需要其他服务器启用 CORS,这在这种情况下很可能不会发生。

于 2012-08-17T00:28:19.347 回答
1

如前所述,您可以使用 JSONP,但端点也必须实现它,并且仅在您从调用中请求 json 数据时使用。看起来您正在检索 html。

您还可以在您的域中实现一个简单的代理,从外部位置提取数据并将其提供给 ajax 调用。您可以使用例如 CURL 在 php 中开发一个简单的代理。

确保您了解这种安全方面的含义,例如确保您保护您的代理只调用该外部 url(白名单)。

更新:我刚刚注意到您不能使用代理解决方案。在遵循您建议的链接之后,我遇到了我不知道的CORS 。很明显,您可以在为域中的页面提供服务时设置一些标头,这些标头将指示浏览器可以完成对某些域的请求。

检查此页面以了解如何实现它:

http://enable-cors.org/

我已经读到您可能需要对其进行一些调整才能与 IE 一起使用,但似乎所有浏览器现在都在实现它。

于 2012-08-17T00:35:31.953 回答
0

我知道这是一个老问题,但我自己也一直在尝试向 validator.w3.org 创建 AJAX 请求,遇到完全相同的问题并偶然发现了这个 SO 问题。

但是,我确实找到了解决方案;

正如人们已经说过的,这里的主要问题是服务器必须发出有效的 CORS 标头,即

访问控制允许来源:*

我使用 Fiddler 检查来自 validator.w3.org 的响应标头,果然,标头没有设置。但是,他们在 validator.w3.org/nu/ 上还有另一个工具。

这是一个例子:http ://codepen.io/DDN-Shep/pen/ogdGgO/

$('form').on('submit', function(e) {
  e.preventDefault();

  var data = new FormData(this);

  $.ajax({
    url: 'http://validator.w3.org/nu/', // Trailing '/' is important or you get a 301 HTTP response status code
    type: 'POST',
    data: data,
    processData: false, // Required for jQuery & FormData
    contentType: false, // Set by FormData, required by the server
    success: function(data, status, xhr) { /* TODO */ },
    error: function(xhr, status, error) { /* TODO */ },
    complete: function(xhr, status) { /* TODO */ }
  });
});

如果您不确定服务器是否允许 CORS,您可以使用这个非常有用的在线工具;

test-cors.org = http://client.cors-api.appspot.com/client

于 2015-02-25T14:59:49.550 回答