我应该通过PUT时传递OPTIONS

时间:2015-07-30 19:10:21

标签: javascript angularjs http-headers angular-resource http-method

我有以下配置。

.config(config);

config.$inject = ["$httpProvider"];

function config($httpProvider) {
  $httpProvider.defaults.useXDomain = true;
  delete $httpProvider.defaults.headers.common["X-Requested-With"];


  //Reset headers to avoid OPTIONS request (aka preflight)
  $httpProvider.defaults.headers.common = {};
  $httpProvider.defaults.headers.post = {};
  $httpProvider.defaults.headers.put = {};
  $httpProvider.defaults.headers.patch = {};
}

至于我的$resource

.factory('Order', order)

order.$inject = ['$resource', "ApiEndpoint", "UserRecord"];

function order($resource, ApiEndpoint, UserRecord) {
  var id = null;

  UserRecord.retrieve().then(function (user) {
    id = user.user_id;
  })

  return $resource(ApiEndpoint.url + 'orders.json', {}, {
    update: {method: 'PUT', url: ApiEndpoint.url + 'orders.json'}
  });
}

现在我这样称呼更新

var params = { name: "new name" };

Order.update(params, {}, function (resp) {
  console.log(resp);
})

我的控制台将No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8100' is therefore not allowed access. The response had HTTP status code 401.呈现为OPTIONS请求。如果我运行POST请求,一切正常并按预期工作。

当我访问服务器日志时,它会验证我是否正在运行OPTIONS请求。如何修复此问题以运行PUT请求?

1 个答案:

答案 0 :(得分:1)

您正在尝试进行CORS(跨源资源共享)请求,这意味着您尝试连接到不是您的源的服务器。您的来源是为您的应用程序提供服务的服务器。

由于浏览器安全策略,除GET之外的每个请求都需要预检握手(OPTIONS),其中非原始服务器描述了哪些标头以及允许某人来自原始X的方法。

因此,跳过预检的唯一方法是将您访问的资源放在为其提供服务的同一台服务器上。