我有一个只读 API,它可以通过 Vagrant 设置在本地正常工作。在我的 Heroku 应用程序上,每个 API 请求都会因 CORS 错误而被拒绝:“请求的资源上不存在“Access-Control-Allow-Origin” header 。因此不允许访问 Origin“null”。”
在我的 API 基类中,我使用以下内容来设置 header :
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
我怀疑这个before
调用没有被触发——如果我在其中使用puts语句,该语句不会与其余输出一起出现在我的控制台中。
我很茫然。希望有人有这方面的经验。谢谢。
编辑:我也关注了Grape's CORS instructions但得到相同的结果。
成功。我使用了 rack-cors gem 和以下内容:
#application.rb
config.middleware.use Rack::Cors do
allow do
origins '*'
# location of your API
resource '/api/*', :headers => :any, :methods => [:get, :post, :options, :put]
end
end
最佳答案
每次发出请求时,您都会收到 Access-Control-Allow-Origin 错误。
这可能是因为您的服务器 API 未响应带有 CORS 所需 header 的 OPTIONS 请求。
如果您使用的是 Google Chrome,可以在开发控制台 -> 网络选项卡中查看。
有趣的是,一些 Javascript 框架在向服务器发送正常请求之前确实会发出 OPTIONS 请求。
解决方案:
- 修改您的 Gemfile 以包含'rack-cors'。
- 运行捆绑安装
- 修改您的 config.ru:
*如果启动 Rails 服务器时出错,请在“运行”后检查您的 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 header 的所有 OPTIONS 请求。
关于ruby-on-rails - 使用 Grape API 和 Heroku 的 CORS 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26998151/