2012-08-17 56 views
2

我在尝试使用this question中的Web服务验证Feed。用javascript调用外部网页(跨域)

但浏览器不允许我发送ajax GET请求到另一台服务器。在该Web服务中,每个请求都有一秒限制,所以我无法从我的服务器镜像请求。

这是我目前的jQuery代码:

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

是不是有什么其他办法?

回答

2

Ajax调用不能跨不同的域有效。 JQuery-ajax-cross-domain是一个类似的问题,可能会给你一些见解。正如Luis在评论中指出的那样,JSONP也必须在您从中获取数据的域上实施。

这里是jQuery的阿贾克斯()的一个例子,但你可能想看看$.getJSON()

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

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

+0

我将等待您的示例:) – 2012-08-17 00:28:51

+0

要使用JSONP,端点还必须实现它。 – Luis 2012-08-17 00:30:56

+0

但正如你所看到的,它是W3服务器,我无法在服务器中实现JSONP。他们是否在他们的服务器上实现了JSONP? – 2012-08-17 00:41:29

2

我搜索谷歌,找到this。第三个答案说:

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

你最好看到this问题的答案。

我想你不能使用JSONP,因为你没有任何访问W3C脚本的权限。

更新(解释)

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

UPDATE2

,让刚刚http://validator.w3.org/你只需要设置Access-Control-Allow-Originhttp://validator.w3.org/

更多的细节,回答说去here。除非你使用JSONP

+1

您的链接指向这个问题! – 2012-08-17 00:29:39

+0

@MahdiGhiasi这是错的!我编辑了它,并且我添加了一个解决方案! – 2012-08-17 00:35:14

+0

请阅读我的问题。我告诉我为什么我不能在服务器端做... – 2012-08-17 00:36:37

1

至于说你可以使用JSONP但端点也必须实现它,而它仅使用,如果你是从呼叫请求JSON数据。它看起来像你正在检索HTML。

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

请确保您了解此安全明智的含义,确保您保护您的代理以仅调用该外部URL(白名单)。

更新:我只注意到你不能使用代理解决方案。并且在您按照链接建议我遇到CORS后,我没有了解事件。因此,当您在域中提供页面时,您可以设置一些标题,以指示浏览器可以完成对某些域的请求。

检查这个网页,如何实现它:

http://enable-cors.org/

我已阅读,你可能不得不调整它有点与IE浏览器的工作,但似乎所有的浏览器目前正在实施它。

+0

请阅读我的问题:* ...该Web服务中每个请求都有一秒限制,所以我无法对来自我的服务器的请求进行镜像。* – 2012-08-17 00:37:40

+0

在ahmadalishafiee在他的答案中链接的页面中,有一些关于http头文件的解决方案。你知道它是什么以及如何使用它? – 2012-08-17 00:39:45

+0

我已经启用了这个头文件(并在web-sniffer.net中进行了测试),但是我的代码仍然无法正常工作...... http://azinium.com/test.html您可以告诉我,我的代码有什么问题吗? – 2012-08-17 01:06:45

0

我知道这是一个老问题,但我自己也一直在尝试创建AJAX请求到validator.w3.org以及碰到同样的问题,并偶然发现这个问题。

但是,我确实找到了解决办法;

由于人们已经说过,这里的主要问题是,服务器必须出具有效的CORS头,即

访问控制允许来源:*

我使用提琴手检查响应头来自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