如何避免“预检请求”?

时间:2016-04-17 14:13:53

标签: ruby-on-rails ember.js ember-data

我正在尝试开始使用Ember Data并立即遇到此问题,浏览器在实际请求之前发送了OPTIONS请求。

我正在尝试与之通信的开发后端是在我的本地计算机上运行的rails 4.2服务器(以rails s -b 0.0.0.0开头) 我目前使用这个api从android和ios应用程序进行通信。我的最终目标是提供除现有rails UI之外的Ember应用程序,但如果我必须更换它并且只有Ember UI,那就没问题了。

我对CORS做了一些阅读,我认为至少要了解它的目的是什么。如果我理解正确,浏览器会将Ember应用程序看作是由服务器以外的服务器提供服务,因为这会询问服务器是否正常。

所以我的问题是:

  1. 我是否可以将我的ember应用程序部署到真实服务器,以便不需要这些CORS OPTIONS请求? (即,我假设rails应用程序可以向浏览器提供Ember应用程序,浏览器将看到脚本的来源与请求的目标相同,而不需要预先请求)
  2. 如何在开发中使用它?我看到在ember s --proxy上有一个--proxy选项,看起来应该是这个的解决方案,但是我无法让它工作
  3. 当我导航到服务器URL时,我试图访问http://localhost:3000/api/v1/users rails记录以下响应:

    Started GET "/api/v1/users" for 127.0.0.1 at 2016-04-17 10:02:01 -0400
    

    基于此,我认为我的Ember适配器设置正确:

    import JSONAdapter from 'ember-data/adapters/json-api';
    
    export default JSONAdapter.extend({
      host: 'http://127.0.0.1:3000',
      namespace: 'api/v1'
    });
    

    然后我用这个命令启动Ember服务器:

    ember s --proxy http://127.0.0.1:3000
    

    rails服务器正在接收以下请求:

    Started OPTIONS "/api/v1/users" for 127.0.0.1 at 2016-04-17 09:36:51 -0400
    

    哪个失败了,因为我没有这样的路线(并且我认为我也不想)。

1 个答案:

答案 0 :(得分:2)

如果您使用--proxy,则不应覆盖host

ember应用应该向当前端点发出所有请求(可能是localhost:4200),开发服务器会将请求重定向到后端。

如果你:

  1. 想要从生产中的后端服务器提供您的余烬应用程序,
  2. 希望在您的开发环境中使用--proxy
  3. 请勿在适配器上设置host,只是玩得开心。如果您设置host,则ember会将数据直接发送到此host,而不是发送到您的开发服务器,从而产生CORS请求。