【发布时间】:2013-01-18 00:25:19
【问题描述】:
我正在使用(已弃用的)Twitter API 1.0 进行一些测试
例如,我想从 API 获取数据,客户端使用来自任何跨域网页的 AJAX 浏览器请求。它可以是新的空白选项卡、本地 HTML 页面或任何现有网站。
我尝试过 JSONP,效果很好,但我想使用默认的 XMLHttpRequest,即使 Twitter 服务器不支持 CORS http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing。
例如,在 google.com 主页上,我创建了一个对 Twitter API 的简单 AJAX 调用,并使用 Firebug 执行:
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 网页的请求之间有两个不同之处(它们适用于 Twitter API 请求,因为它是 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 请求会起作用吗?
【问题讨论】:
-
不是服务器需要遵守 SOP,但浏览器需要。即使你发送不同的 header,你的浏览器也知道这是一个跨域请求。
-
@Bergi 很高兴知道,所以问题可能来自浏览器...... Firefox 是开源的,如果它不是跨域请求,难道不能表现得像吗?我应该更改响应 HTTP 标头而不是请求标头吗?
-
是的,你可以试试(我不知道扩展名)。也许还有一个隐藏的配置标志可以完全禁用 SOP。
-
@Bergi 感谢您的想法,实际上有方法可以禁用 SOP,但不是通过我使用的插件
标签: javascript ajax http-headers cross-domain cors