我正在实施Dropbox" / list_folder / longpoll"在Javascript中通过他们的API调用。如上所述here,由于跨域访问控制错误,API调用失败。
Dropbox建议采用违反W3C标准的hacky解决方法:设置无效" Content-Type"标题" text / plain; charset = dropbox-cors-hack",它以某种方式帮助满足对简单的跨站点请求的要求"因此跳过跨域检查。因为这违反了Web标准,浏览器会将标头修改回有效的表单,并且API调用始终会失败。
我发现了几种可行的解决方法:
使用自己的服务器将来自浏览器> dropbox的呼叫转移到浏览器 - >自己的服务器 - > dropbox。对服务器进行ajax调用,服务器向dropbox发出cURL请求,一切正常。
这种方法的缺点是你必须拥有一个有能力的服务器和备用资源来保持你所有用户的长连接打开。我无法有效地在PHP中实现这一点。
使用Javascript的新fetch()方法代替XMLHttpRequest。它似乎允许设置无效的标头,API调用工作正常。设置正常(而不是hacky)标头会导致呼叫失败。
此方法的缺点是浏览器支持。如果没有fetch polyfill,只有Chrome和Firefox支持此功能。使用polyfill理论上也增加了对IE和Safari的支持。但是因为polyfill基于XMLHttpRequest,所以标题会更改为有效标题,就像使用纯XMLHttpRequest时一样。除了IE之外,无效的标题不会被改回,因为IE。
我选择了第二种解决方法,所以现在我没有Safari支持。
我的问题是:如何解决这个问题?也许以某种方式让PHP处理更长时间(1-2分钟)的cURL调用更有效?或者可能通过某种方式黑客入侵设置无效Content-Type标头的跨浏览器解决方案?
我在考虑iframe,但这有点荒谬:)