在 GET 之前重新发送 OPTIONS 方法

Restangular sending OPTIONS method before GET

我正在使用只接受 GET 方法并限制使用 OPTIONS 的 API。当我在 chrome 中发送请求(通过 --disable-web-security 绕过 cors)时,它会在 GET 方法之前发送 OPTIONS 方法,从而阻止获取资源。

然而,在 Safari 中,我可以获得资源,因为它只发送一个 GET。我通过 ionic 框架在移动设备上进行测试,但我无法获取资源,我假设 OPTIONS 是造成这种情况的原因。我试过创建一个自定义请求,虽然 this, this and this 和文档会有所帮助,但我一直没有运气。这就是我的代码的样子,我刚开始使用 Restangular 并且仍在弄清楚它,任何 help/tips 都值得赞赏。谢谢

      .constant('baseURL', {
          url: 'https://api.example.com'
      })

      .config([
  'RestangularProvider', 'baseURL',
  function(RestangularProvider, baseURL) {

    RestangularProvider.setBaseUrl(baseURL.url);


    RestangularProvider.setDefaultHeaders({
      Authorization: 'Basic ' + baseURL.jwt
    })

  }
])


      .controller('MainCtrl', ['$scope', 'Restangular',
          function($scope, Restangular) {

              Restangular.one('destinations').get('').then(function(destinations) {

      $scope.destinationBase = destinations;

    });

您可以尝试拦截响应,如果方法是 OPTIONS 并且请求是针对有问题的 URL 发出的,请将响应代码修改为 200204.

这里只是一个偏好问题,而不是使用 RestangularProvider.addResponseInterceptor, I would add a function to the $httpProvider.interceptors 数组。 Restangular 在后台使用 $http,那么为什么不跳过中间人直接进入源代码呢?

像这样的东西应该可以工作:

angular.module('myApp', ['restangular'])
    .config(httpConfig);

function httpConfig($httpProvider) {
    $httpProvider.interceptors.unshift(interceptor);

    function interceptor() {
        return {
            response: responseInterceptor
        };

        function responseInterceptor(response) {
            if (response.config.url === 'http://my.api.com/endpoint' && response.config.method === 'OPTIONS' && response.status > 299) {
                response.status = 204;
                response.statusText = 'No Content';
            }

            return response;
        }
    }
}

response对象被描述为here, and response.config is described here

我想通了,我从来没有处理过预检问题,这就是问题所在。我刚刚打开我的浏览器设置为禁用 cors