5

我正在用(已弃用的)Twitter API 1.0 做一些测试

例如,我想从 API 获取数据,客户端使用来自任何跨域网页的 AJAX 浏览器请求。它可以是新的空白选项卡、本地 HTML 页面或任何现有网站。

我试过 JSONP,效果很好,但我想使用默认的 XMLHttpRequest,即使 Twitter 服务器不支持 CORS http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

例如,在 google.com 主页上,我创建了一个使用 Firebug 执行的对 Twitter API 的简单 AJAX 调用:

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.twitter.com/1/friends/ids.json?screen_name=baptx", false);
xhr.send();

由于相同的来源策略,这将不起作用并在 Firebug 上打印错误:

Error: Failure
xhr.send();

它返回 HTTP 200 OK 代码,但未从服务器接收到 JSON 数据。

我已经看到来自 google.com 网页和 api.twitter 网页的请求之间的两个区别(因为它是 API 域名,所以它适用于 Twitter API 请求,同源)。

已添加带有当前域名的 Origin HTTP 标头:

Origin  https://www.google.com

Referer HTTP 标头不是 https://api.twitter.com/像来自 api.twitter.com 页面的请求,但在我的情况下:

Referer https://www.google.com/webhp?hl=en

这就是为什么我试图删除 Origin HTTP 标头并将当前的 Referer HTTP 标头修改为https://api.twitter.com/

我已经使用 Firefox ModifyHeaders 扩展完成了这项工作,它可以工作,我可以在 Firebug“Net”选项卡中检查这些更改是否正确。

现在,我从来自 google.com 网页和 api.twitter.com 网页的请求中获得了相同的请求标头。它仍然无法从 API 以外的其他域发出 AJAX 请求,即使 HTTP 标头被覆盖,为什么?

顺便说一句,你知道为什么从 Firefox“新标签”向 Twitter API 发出的 AJAX 请求会起作用吗?

4

1 回答 1

6

如果 web 服务器不允许跨域资源共享,我们必须手动添加 HTTP 响应头 Access-Control-Allow-Origin: *

我认为问题出在请求标头中。没有 Firefox 插件来修改 HTTP 响应标头,ModifyHeaders 或 TamperData 仅支持请求标头: 在 Firefox 中修改 HTTP 响应标头

我的问题实际上与此类似:我可以在任何浏览器上禁用 SOP(同源策略)以进行开发吗?

解决方案:有人开发了一个 Firefox 插件来强制 CORS:https ://addons.mozilla.org/en-US/firefox/addon/forcecors/ 。或者我们可以在 GreaseMonkey 脚本中使用 GM_xmlhttpRequest,它会绕过 XMLHttpRequest 的同源策略。还有一个名为 Header Editor 的新插件,它是开源的,可以编辑请求和响应头:https ://addons.mozilla.org/en-US/firefox/addon/header-editor/ 。

在 Chrome 中,没有插件可以修改 HTTP 请求/响应标头,因为浏览器不提供 API,但有一个禁用 SOP 的标志(--disable-web-security)

于 2013-02-05T21:37:16.230 回答