Javascript 无法将内容类型为application/json的内容从angular发布到rails
因此,我尝试将内容类型为application/json的POST请求从angular发送到我的rails后端。我在控制台中遇到以下错误: angular.js:12578选项404(未找到) 及 无法加载XMLHttpRequest。对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。因此,不允许访问源“”。响应的HTTP状态代码为404 注意:当我使用Javascript 无法将内容类型为application/json的内容从angular发布到rails,javascript,ruby-on-rails,angularjs,json,cors,Javascript,Ruby On Rails,Angularjs,Json,Cors,因此,我尝试将内容类型为application/json的POST请求从angular发送到我的rails后端。我在控制台中遇到以下错误: angular.js:12578选项404(未找到) 及 无法加载XMLHttpRequest。对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。因此,不允许访问源“”。响应的HTTP状态代码为404 注意:当我使用内容类型:application/x-www-form-urlencoded 它还可以在Postman中使用头中
内容类型:application/x-www-form-urlencoded
它还可以在Postman中使用头中设置的application/json内容类型
角度控制器:
.controller('View1Ctrl',函数($scope,$http){
风险值数据={
姓名:“姓名”
};
$http({
网址:'http://localhost:3000/api/student_create',
数据类型:“json”,
方法:“POST”,
数据:数据,
标题:{
“接受”:“应用程序/json”,
“内容类型”:“应用程序/json”,
“访问控制允许来源”:“*”
}
}).然后(功能(响应){
console.log(响应)
},函数(错误){
console.log(错误)
});
});
API控制器(Rails):
class ApiController
路线:post'api/student\u create'=>'api'create\u student'
编辑:前端打开,后端在本地主机上:3000
因此,即使您的使用者在“localhost:3000”上,而您的提供者在“localhost:3001”上,响应也将被忽略,除非您的web服务设置了许可的CORS策略。此策略由提供商在HTTP响应中设置消费者应用程序(如浏览器)要强制执行的特定CORS头来定义。例如,配置这些标头:
config/application.rb中的#
config.action\u dispatch.default\u头={
'访问控制允许来源'=>'http://my-web-service-consumer-site.com',
“访问控制请求方法”=>%w{
获取帖子选项
}.join(“,”)
}
每个站点:
请注意,设置“Access Control Allow Origin”=>“*”是非常不鼓励的,除非您提供的公共API是供任何消费者访问的。嗨,我在与Angular Rails交互时也遇到了这个问题。 经过大量的研究,我发现gem'rackcors'解决了这个问题。您可以按照它的文档进行操作。默认情况下,Rails不允许跨源资源共享。因此,基本上它可以很好地处理跨源请求 步骤: 安装gem:
gem install rack-cors
或在您的文件中:
gem 'rack-cors', :require => 'rack/cors'
application.rb文件
module YourApp
class Application < Rails::Application
# ...
# Rails 3/4
config.middleware.insert_before 0, "Rack::Cors" do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
# Rails 5
config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
end
end
moduleyourapp
类应用程序:any,:methods=>[:get,:post,:options]
结束
结束
#轨道5
config.middleware.insert_在0之前,Rack::Cors do
允许做
起源“*”
资源“*”,:headers=>:any,:methods=>[:get,:post,:options]
结束
结束
结束
结束
您试图发布的数据大小是多少?它只是文本。(angular controller中的数据
对象)您能否验证发送的对象是有效的jsonobject@alphapilgrim是的,它是有效的,它只是数据
对象Rails代码需要一个路由,用于以CORS头响应的选项请求。您可以尝试使用数据类型:“jsonp”。尝试搜索如何为跨域ajax调用使用iplement jsonp。
module YourApp
class Application < Rails::Application
# ...
# Rails 3/4
config.middleware.insert_before 0, "Rack::Cors" do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
# Rails 5
config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
end
end