键入:application / json从angular到rails

所以我试图发送一个POST请求与Content-Type:application / json从angular到我的rails后端。 在控制台中出现以下错误:

angular.js:12578选项http:// localhost:3000 / api / student_create 404(未找到)

XMLHttpRequest无法加载http:// localhost:3000 / api / student_create。 对预检请求的响应不会通过访问控制检查:请求的资源上不存在“访问控制 - 允许来源”标头。 原因'http:// localhost:8008'因此不被允许访问。 该响应具有HTTP状态码404。

注意,当我使用Content-Type: application/x-www-form-urlencoded时,发布请求可以正常工作

它也可以在Postman中使用头文件中的application / json Content-Type设置。

角度控制器:

.controller('View1Ctrl', function($scope, $http) {

  var data = {
    name: "name"
  };
  $http({
    url: 'http://localhost:3000/api/student_create',
    dataType: 'json',
    method: 'POST',
    data:data,
    headers: {
      "Accept": "application/json",
      "Content-Type": "application/json",
      "Access-Control-Allow-Origin": "*"
    }
  }).then(function(response) {
    console.log(response)
  }, function(error) {
    console.log(error)
  });

});

API控制器(Rails):

class ApiController < ApplicationController
     before_action :set_headers
     skip_before_action :verify_authenticity_token

  def set_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT'
    headers['Access-Control-Request-Method'] = '*'
    headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
    end
  def create_student
    student = StudentUser.new
    student.name= params[:name]
    student.save
    render json: "test".to_json #temporary
  end

route: post 'api/student_create' => 'api#create_student'

编辑:前端位于http:// localhost:8008,后端位于localhost:3000


嗨我也遇到过这个问题,当我与Angular交互Rails时。 经过大量研究,我发现了解决这个问题的宝石'架子'。 你可以在这里按照它的文档。 默认情况下,Rails不允许跨源数据共享。 所以基本上它很好地处理了跨源请求。

脚步:

安装宝石:

gem install rack-cors

或者在您的Gemfile中:

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

从如何在Rails API应用程序中配置CORS接受标头中尝试以下操作

因此,即使您的用户位于“localhost:3000”并且您的提供商位于“localhost:3001”上,除非您的Web服务设置了允许的CORS策略,否则响应将被忽略。 该策略由供应商在消费者应用(例如浏览器)注定强制执行的HTTP响应中设置特定的CORS头部来定义。 例如,配置这些头文件:

# in config / application.rb
config.action_dispatch.default_headers = {
  'Access-Control-Allow-Origin' => 'http://my-web-service-consumer-site.com',
  'Access-Control-Request-Method' => % w {
    GET POST OPTIONS
  }.join(",")
}

每个站点:

请注意,设置'Access-Control-Allow-Origin'=>'*'是非常不鼓励的,除非您提供了一个公共API,任何用户都可以访问它。

链接地址: http://www.djcxy.com/p/46249.html

上一篇: type: application/json from angular to rails

下一篇: XMLHttpRequest/ajax set Content