【问题标题】:Ajax And REST: Can I send an ajax request to a REST service to recieve response?Ajax 和 REST:我可以向 REST 服务发送 ajax 请求以接收响应吗?
【发布时间】:2010-03-23 11:39:10
【问题描述】:

我想使用 mootools 和 SqueezBox 类来处理对 RESTful 服务的请求。我不想使用任何服务器端脚本。我正在使用 AJAX。我使用 GET 方法向以下 url 发送请求。 http://www.idevcenter.com/api/v1/links/links-upcoming.json 但我收到 404 错误。是因为跨站脚本吗?这是我的代码:

SqueezeBox.initialize({handler:'url',ajaxOptions:{method:'GET'}}); $('a.modal').addEvent('click',function(e){ 新事件(e).stop(); SqueezeBox.fromElement($('a.modal')); });

在 Firebug 控制台中,有时会显示“已中止”,有时会显示“404”。这有什么问题?

【问题讨论】:

    标签: ajax rest xss


    【解决方案1】:

    XMLHttpRequest 以Same Origin Policy 为准;如果您的 JavaScript 在其中运行的文档与您尝试调用的服务的来源不同,则出于安全原因,该调用将被禁止。

    现在有一个cross-origin resource sharing 的提议标准来解决这个问题。可能是您尝试使用的服务支持它;如果是这样,使用实现 CORS 的浏览器(最新版本的 Firefox 和 Chrome 会这样做,其他一些也是如此)可能会起作用。 IE8 supports it 但需要你做额外的工作。

    【讨论】:

    • 我在我的请求中看到一些标头,这些标头似乎是跨域标头。我得到了响应,但出现了 404 错误。所以我认为打了电话。 Access-Control-Request-Method: GET Access-Control-Request-Headers: x-requested-with
    • 是的,这两个都是 CORS 请求标头(也应该有一个 Origin)。如果您收到 404(我在您的原始问题中错过了!),那 应该 意味着该资源根本不在该 URL 中,而不是您无权访问它(这就是 401、403 等的用途 - en.wikipedia.org/wiki/List_of_HTTP_status_codes)。所以我会再次检查网址。
    • 更新:我刚刚尝试过,得到了相同的结果:直接浏览器请求给了我 JSON,但我无法通过 XHR 加载它。原因是 idevcenter 使用 404 响应 OPTIONS 请求,这意味着它们不支持 CORS(或者至少不支持预飞行的 CORS)。我本来期望 404 以外的东西,但是,嘿,CORS 是新的。可能值得问问他们是否会考虑。
    • 嘿,谢谢!!你的回答真的很有帮助。我给他们发了一封电子邮件。也许他们会回答;)
    【解决方案2】:

    您不能使用 XMLHttpRequest(即普通的“ajax”)调用不在您域中的服务器上的服务。

    但是,您可以使用 JSONP 技巧,它利用了浏览器从其他域加载 Javascript 的事实。但是,服务必须知道您将要这样做,并且它必须了解协议。该特定服务似乎非常愿意给我一个 JSON 响应,但是当我给它一个“回调”参数时它并没有注意。 (我已经尝试过“回调”和“jsonp”,返回的 JSON blob 是相同的,没有函数调用包装器。)

    【讨论】:

    • 感谢您的关注。如果无法发送请求,为什么我会收到 404 错误的响应?我想如果没有调用,我不应该得到服务器的响应。
    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2018-05-31
    • 2014-08-15
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多