Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用葡萄API和Heroku发布CORS_Ruby On Rails_Api_Heroku_Cors - Fatal编程技术网

Ruby on rails 使用葡萄API和Heroku发布CORS

Ruby on rails 使用葡萄API和Heroku发布CORS,ruby-on-rails,api,heroku,cors,Ruby On Rails,Api,Heroku,Cors,我有一个只读的API,它在本地运行良好,有一个流浪设置。在我的Heroku应用程序上直播,由于CORS错误,每个API请求都被拒绝:“请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问Origin'null。” 在API的基类中,我有以下设置头: module API class Base < Grape::API before do headers['Access-Control-Allow-Origin'] = '

我有一个只读的API,它在本地运行良好,有一个流浪设置。在我的Heroku应用程序上直播,由于CORS错误,每个API请求都被拒绝:“请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问Origin'null。”

在API的基类中,我有以下设置头:

module API
  class Base < Grape::API
    before do
      headers['Access-Control-Allow-Origin'] = '*'
      headers['Access-Control-Allow-Methods'] = 'GET, OPTIONS'
      headers['Access-Control-Request-Method'] = '*'
      headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
    end

    mount API::V1::Base   
  end
end

每次发出请求时都会出现访问控制允许源错误

这可能是因为您的服务器API没有使用CORS所需的头响应选项请求

如果您正在使用Google Chrome,您可以在开发控制台->网络选项卡中查看它

有趣的是,一些Javascript框架确实在向服务器发送正常请求之前发出了一个选项请求

解决方案:

  • 修改您的GEM文件,以包括'rack-cors'
  • 运行捆绑安装
  • 修改您的config.ru
  • *如果启动rails服务器时出错,请在“run”之后检查API命名空间

    require 'rack/cors'
    
    use Rack::Cors do
      allow do
        origins '*'
        resource '*', headers: :any, methods: [:get, :post, :options, :put]
      end
    end
    
    run API::V1::Base
    

    现在,您应该看到Grape使用CORS标题处理所有选项请求。

    是的,我在最初的帖子中已经发布了成功的解决方案。谢谢。我刚刚意识到我从grape docs复制的答案没有包括选项方法。现在已经更新了。([:get,:post,:options,:put]而不是just:get)只需注意rails框架,在config.ru中,在line
    run rails.application之前添加line
    run API::V1::Base
    require 'rack/cors'
    
    use Rack::Cors do
      allow do
        origins '*'
        resource '*', headers: :any, methods: [:get, :post, :options, :put]
      end
    end
    
    run API::V1::Base