我正在使用(已弃用的)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 域名,同源)之间的两个区别。
已使用当前域名添加源 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 网页的请求的相同请求标头。即使 HTTP 标头被覆盖,它仍然无法从 API 以外的另一个域执行 AJAX 请求,为什么?
顺便问一下,你知道为什么从Firefox"New Tab"向Twitter API发出的AJAX请求会起作用吗?
如果 Web 服务器不允许跨域资源共享,我们必须手动添加 HTTP 响应标头 访问控制允许来源: *
我认为问题出在请求标头中。没有 Firefox 插件来修改 HTTP 响应标头,只有请求标头由 ModifyHeaders 或 TamperData 支持:在火狐浏览器中修改 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中,由于浏览器不提供API,因此没有插件可以像您想要的那样修改HTTP请求/响应标头,但是有一个标志可以禁用SOP(--disable-web-security)。