【问题标题】:Passing OPTIONS when I should Pass PUT当我应该离开时传递 OPTIONS
【发布时间】:2015-10-22 07:18:21
【问题描述】:

我有以下配置。

.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 请求?

【问题讨论】:

  • 为什么不直接让服务器响应 OPTIONS 请求呢?
  • 脚本的url是什么,脚本请求的资源的url是什么?如果存在,请包含协议和子域。
  • 脚本的url和资源的url不一样。 localhost:8100 与普通域相比。该域没有子域。

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


【解决方案1】:

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

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

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

【讨论】:

  • 我可以发出 POST 请求。为什么 POST 请求有效,而 PUT 请求无效?
  • 有意思,能加个plunker吗?
  • 并非如此。该项目是保密协议,我不想再发布信息了。我觉得我提供的代码足以解决答案。如果对代码有任何问题,请随时提出,我会尽力回答。
  • 唯一能问的问题是应用的服务器和数据的服务器是否同源?
  • 那么这是一个 CORS 请求。好像 POST 可以跳过 preflight,在这个链接中查看简单的请求developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
猜你喜欢
  • 2017-01-06
  • 2013-09-28
  • 2019-02-18
  • 1970-01-01
  • 2013-06-04
  • 2020-03-29
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
相关资源
最近更新 更多