方法使用$ resource Angular键入“OPTION”而不是“GET”

时间:2014-05-27 17:34:52

标签: angularjs

我正在尝试使用下面提到的代码使用$ resource调用Restful Api。在网络选项卡上,我发现方法类型是" OPTION"而不是" GET"并输入" text / html" (仅当我添加自定义标头时)。如果我删除了运行代码块,那么一切正常。但我必须添加这些标题,任何想法?

 app.run(['$route', '$http', function ($route, $http) {

        $http.defaults.headers.common['X-User'] = 'user';
        $http.defaults.headers.common['X-Password'] = 'password';
    }]);

var resource = $resource('api', {});


 var deffered = $q.defer();

            resource.query({
                method: 'GET',
                isArray: true,

            }, function (data) {
                deffered.resolve(data);
            }, function (status) {

                deffered.reject(status);
            });

            return deffered.promise;

1 个答案:

答案 0 :(得分:1)

问题

一个简单的跨站点请求,它不需要OPTIONS预检,它是:

  

仅使用GET,HEAD或POST。如果使用POST将数据发送到   server,使用HTTP发送到服务器的数据的Content-Type   POST请求是application / x-www-form-urlencoded之一,   multipart / form-data,或text / plain。

     

不设置自定义标头   HTTP请求(例如X-Modified等)

(来自MDN上的HTTP access control (CORS)文章)

您的请求未通过第二个条件(即添加标题),因此如果没有OPTIONS预检,则无法通过浏览器发送。

解决方案

  • 配置您的API以处理OPTIONS(根据您自己的评论,听起来您不能这样做)
  • 设置反向代理,自行处理请求的Web服务器,返回从您尝试从中获取数据的API端点收到的结果

你如何做后者在很大程度上取决于你可以设置什么类型的网络服务器以及在哪里(例如你使用Node?nginx?Apache?代理是否会与客户端应用程序托管在同一个域上?),所以你需要在网上研究“反向代理CORS”的主题,并考虑到你的情况。