【问题标题】:Setting up cross-domain calls on Rails server在 Rails 服务器上设置跨域调用
【发布时间】:2013-07-23 11:34:57
【问题描述】:

我正在开发一个 Rails API 和一个单独的 html5 应用程序。他们不共享同一个域。如何设置我的 Rails 应用程序以接受跨域请求?我已将以下内容添加到我的 ApplicationController 的顶部,但没有任何运气 -

  before_filter :set_access_control_headers

  def set_access_control_headers
    headers['Access-Control-Allow-Origin'] = 'http://myfrontend.com:3002'
    headers['Access-Control-Request-Method'] = 'GET, OPTIONS, HEAD'
    headers['Access-Control-Allow-Headers'] = 'x-requested-with,Content-Type, Authorization'
  end

我在其他应用程序上的 javascript 如下所示 -

var req = $.ajax({
  url: url,
  type: "GET",
  crossDomain: true,

  success: function(data, textStatus, jqXHR)
  {
     alert('success');
  },
  error: function(jqXHR, textStatus, errorThrown)
  {
     alert('error');
  }
});

当我运行这个请求时,我在我的服务器日志中得到以下信息 -

Started OPTIONS "/api/search?location_uuid=22222222222222222" for 127.0.0.1 at 2013-07-15 16:49:56 -0400
Processing by Api::V1::SearchController#index as JSON
  Parameters: {"location_uuid"=>"22222222222222222"}
WARNING: Can't verify CSRF token authenticity
  User Load (20.5ms)  SELECT "users".* FROM "users" ORDER BY name DESC LIMIT 30 OFFSET 0
(63.1ms)  SELECT COUNT(*) FROM "users" 
Completed 204 No Content in 300ms (ActiveRecord: 0.0ms)

有人有什么技巧可以让它正常工作吗?

【问题讨论】:

  • 愚蠢,但是 - 你是否已经为 OPTIONS 实施了行动?你的路线是怎样的?
  • 试试after_filter 而不是before_filter
  • 这是一个有趣的观察。在我的请求中,我指定了 GET,但日志表明正在设置 OPTIONS 标头。路由看起来像这样 - 命名空间 :api,默认值:{format: 'json'} do scope module: :v1 do match "/search", :to => "search#index" end end

标签: javascript jquery ruby-on-rails cross-domain


【解决方案1】:

似乎将数据类型添加为 JSONP 可以避免跨浏览器问题:

var req = $.ajax({
  url: url,
  type: "GET",
  crossDomain: true,
  dataType: "JSONP",
  ...

查看这个问题了解更多信息 -

Can anyone explain what JSONP is, in layman terms?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 2011-10-20
    • 2016-08-09
    • 2011-10-05
    • 2018-02-10
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多