处理跨域 REST 响应的 301 和位置标头

Posted

技术标签:

【中文标题】处理跨域 REST 响应的 301 和位置标头【英文标题】:Dealing with a 301 and location headers for a REST response in cross-domain 【发布时间】:2014-09-05 19:14:07 【问题描述】:

我正在使用 Angularjs Chrome 35.0 和 Firefox 30.0。

我需要向 API 发出 Rest 请求。

每个具有 200,201,404 (...) 作为响应的请求都运行良好。

其中一些响应带有 301 和位置标头。

我的 javascript

this.folder = function(folder) 
        var url = config.domain + '/' + folder.key;
        var methods = resource(url, null, 
            'move': 
                method: 'PUT',
                params: 
                    'move': ''
                ,
                headers: 
                    'copy-source': '/path/to/' + folderKey
                ,
                url: config.domain + '/path/to/' + newKey
            
        );

在调用之后(确实有效),我在控制台中显示了这个错误:

XMLHttpRequest 无法加载 http://domain.com/path/to/folder?move=。该请求被重定向到“http://domain.com/path/to/folder”,这对于需要预检的跨域请求是不允许的。

编辑

我有一个错误状态 0 而不是真正的 301。所以如果我无法在 301 和 0 响应之间做出任何区别,就不可能处理响应...

【问题讨论】:

这个错误听起来很容易解释。有什么问题? @Quentin : ** ADD ** : 我有一个错误状态 0 而不是真正的 301。所以如果我不能在 301 和0 回复... 使用错误处理程序并检查状态并做出相应反应 你能不能说的更精确一点? 【参考方案1】:

我确实做了一个拦截器并检查了一个特定的标题,它应该只在这种情况下出现。 这不是很合适,但我想这是最好的解决方案......

var interceptor = ['$rootScope', '$q',
                function(scope, $q) 
                    var success = function(response) 
                        return response;
                    

                    var error = function(response) 
                        if (response.status === 0)  // server not responding
                            if (angular.isDefined(response.config.params['move'])) 
                                response.status = 301;
                                response.genericMessage = 'Folder correctly moved';
                             else 
                                response.genericMessage = 'Server Connection refused, is it on ?';
                                window.location = '/#/login';
                            
                        
                        return $q.reject(response);
                    

                    return function(promise) 
                        return promise.then(success, error);
                    
                
            ];
            $httpProvider.responseInterceptors.push(interceptor);

【讨论】:

以上是关于处理跨域 REST 响应的 301 和位置标头的主要内容,如果未能解决你的问题,请参考以下文章

无法从前端 JavaScript 访问跨域响应标头

验证来自 Javascript 的跨域请求

跨域资源共享错误:预检响应不允许标头

如何通过跨域 ajax 获取响应头?

允许跨域 ajax 请求中的标头

跨域请求过滤掉了我的大部分 API 响应标头