我正在使用(已弃用的)Twitter API 1.0进行一些测试
例如,我想从客户端使用来自任何跨源网页的AJAX浏览器请求从API获取数据。它可以是新的空白选项卡,本地HTML页面或任何现有网站。
我尝试过JSONP,虽然Twitter服务器不支持CORS http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing,但它仍然可以使用默认的XMLHttpRequest。
在google.com主页上,我创建了一个简单的AJAX调用,我使用Firebug执行Twitter API:
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标头不像来自api.twitter.com页面的请求https://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网页的请求的SAME请求标头。 它仍然无法从API以外的其他域执行AJAX请求,即使HTTP标头被覆盖,为什么呢?
顺便问一下,你知道为什么从Firefox“New Tab”对Twitter API的AJAX请求会起作用吗?
答案 0 :(得分:4)
如果Web服务器不允许跨源资源共享,我们必须手动添加HTTP响应头Access-Control-Allow-Origin:*
我认为问题出在请求标题中。没有Firefox插件可以修改HTTP响应头,只有ModifyHeaders或TamperData支持请求头: Modifying HTTP response headers in Firefox
我的问题实际上与此类似:Can I disable SOP (Same Origin Policy) on any browser for development?
解决方案:有人开发了一个Firefox插件来强制使用CORS:https://addons.mozilla.org/en-US/firefox/addon/forcecors/。或者我们可以在GreaseMonkey脚本中使用GM_xmlhttpRequest,它将绕过XMLHttpRequest的相同原始策略。在Chrome中,由于浏览器不提供API,因此没有用于修改HTTP请求/响应标头的插件,但是有一个禁用SOP的标志(--disable-web-security)