【问题标题】:Connect to API endpoint with Angular factory使用 Angular 工厂连接到 API 端点
【发布时间】:2015-08-15 04:07:06
【问题描述】:

我正在尝试通过最简单的 AngularJS sn-p 连接 API 端点,但有一些问题阻止了我。

这是我的控制器:

app.controller('appController', ['$scope', 'skills',
 function($scope, skills) {
 skills.success(function(data) {
  $scope.skillsList = data;
});
  }
]);

还有我的工厂:

app.factory('skills', ['$http', function($http) { 
  return $http.get('https://www.persevy.com/skills') 
        .success(function(data) { 
          return data; 
        }) 
        .error(function(err) { 
          return err; 
        }); 
}]);

我什至为此准备了Plunkr,但也没有成功,请告诉我上面代码的问题在哪里。

【问题讨论】:

  • 看起来像 CORS 问题..访问不同的域
  • 代码看起来很可靠,在控制台中得到这个 XMLHttpRequest 无法加载persevy.com/skills。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'run.plnkr.co'。
  • 确定如何修复并允许访问?
  • 你的 API 是用什么写的? (Rails 有没有机会?)

标签: angularjs angularjs-scope angularjs-ng-repeat


【解决方案1】:

在 app/controllers/application_controller.rb 中的 RoR API 中:

before_filter :add_allow_origin_headers

def add_allow_origin_headers                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
  response.headers['Access-Control-Allow-Origin'] = request.headers['Origin'] || '*'                                                                                                                                                                                                                         
end 

或者你可以使用gem,称为rack-cors

#Gemfile
gem 'rack-cors'

#config/application.rb
config.middleware.use Rack::Cors do
   allow do
     origins '*'
     resource '*', :headers => :any, :methods => [:get, :post, :options]
   end
end

这将允许来自不同应用程序的请求,为您解决问题。
有关rack-cors gem 的更多信息here

【讨论】:

    【解决方案2】:

    您的问题似乎与 CORS 有关:基本上,如果服务器端不允许使用 Ajax,您将无法通过 Ajax 访问域。这是大多数现代浏览器上的“安全”功能。使用curlPostman chrome 的扩展等命令行不会遇到这个问题。

    如果您拥有域 https://www.persevy.com/,请确保在 Access-Control-Allow-Origin 标头以及 http 动词(GETPOSTPUT... 或* 用于每个 http 方法)。

    如果您使用的是 API,您应该在文档中找到与此相关的内容。

    编辑

    我对 RoR 有点生疏,但从我的谷歌搜索来看,您可以使用 rails-cors gem,或尝试 this gist

    基本上,归结为将以下两个标头添加到服务器的响应中:

    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: *
    

    【讨论】:

    • 但是应该允许从同一个域访问是吗?
    • 不,您必须明确允许服务器端的域。您可以使用* 允许所有域用于测试目的,您能告诉我们您的服务器使用什么语言吗?这是一个浏览器功能,如果你使用curl发布数据你就不会遇到这个问题
    • 没错,从curl我可以毫无问题地访问,这个应用程序是用RoR编写的,如何允许呢?
    • 我的 Rail 生锈了,但是用谷歌搜索 CORS Rails,你应该会找到你要找的东西。见编辑
    猜你喜欢
    • 2022-06-12
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多