Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.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
Javascript 无法将内容类型为application/json的内容从angular发布到rails_Javascript_Ruby On Rails_Angularjs_Json_Cors - Fatal编程技术网

Javascript 无法将内容类型为application/json的内容从angular发布到rails

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/json的POST请求从angular发送到我的rails后端。我在控制台中遇到以下错误:

angular.js:12578选项404(未找到)

无法加载XMLHttpRequest。对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。因此,不允许访问源“”。响应的HTTP状态代码为404

注意:当我使用
内容类型: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