【问题标题】:Options method not allowed, CORS to Google Drive不允许使用选项方法,CORS 到 Google Drive
【发布时间】:2015-08-01 16:28:57
【问题描述】:

我创建了一个用于发布到 this document 的 google drive 的脚本。

我用

调用它
var request = $.ajax({
            url: "https://script.google.com/macros/s/AKfycbypnRet5l6gUmoGE8oZV2_6da7fImNU12ejHCHCdOambH7UM2CP/exec",
            data: serializedData,
            type: "POST",
            timeout: 10000,
            async: true,
            crossDomain: true
        });

适用于this jsFiddle

但是,当我在本地项目中实现完全相同的代码时,它不起作用。我收到了

XMLHttpRequest 无法加载 https://script.google.com/macros/s/AKfycbypnRet5l6gUmoGE8oZV2_6da7fImNU12ejHCHCdOambH7UM2CP/exec。 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:3000” 使用权。响应的 HTTP 状态代码为 405。

405 是“不允许的方法”,当我检查网络流量时,我发现对于我的本地请求,方法是

Request Method:OPTIONS

但是,对于 jsFiddle 中的那个,它按预期发布。我做了一些研究,似乎options是跨域时的预检请求,我不能让它直接使用post。

不工作的 OPTIONS 请求具有以下不在工作 Fiddle 请求中的标头:

access-control-request-headers:accept, content-type
access-control-request-method:POST

如果我将相同的请求发布到我的服务器(而不是 Google),我会看到它包含请求标头 Content-Type:application/json; charset=UTF-8

当不允许使用 options 方法时,jsFiddle 是如何通过的?我能不能让它跳过选项直接发帖?

【问题讨论】:

  • 在发送请求之前这样做有效吗? $.support.cors = true;
  • 据我所知,没有区别。仍然收到同样的错误。
  • 你会尝试在没有端口:3000 的情况下运行它吗?同时我正在考虑一些解决方案
  • 如果不指定端口号,我无法真正在本地运行服务器。但是,我确实尝试将其部署到 url 中没有端口号的测试环境,并收到相同的错误。感谢您提供帮助。

标签: javascript jquery cors google-docs


【解决方案1】:

当请求不简单时发生预检 OPTIONS 请求,由非简单标头或非简单 HTTP 方法引起。

access-control-request-headers: accept, content-type 标头表示您正在尝试发送非简单标头。 Accept 总是简单的,但 Content-Type 只有在其值为 application/x-www-form-urlencodedmultipart/form-datatext/plain 时才是简单的。一定是您的代码(无论出于何种原因)试图为 Content-Type 使用非简单值,而 Google 没有提供 Access-Control-Allow-Headers 响应标头来允许它。

相反,您必须为Content-Type 指定一个简单的值。您可以通过将显式 contentType: "application/x-www-form-urlencoded; charset=UTF-8" 属性添加到 $.ajax 选项对象来做到这一点。

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2013-03-13
    • 1970-01-01
    • 2018-06-16
    • 2014-01-09
    • 1970-01-01
    • 2015-08-15
    • 2016-08-05
    • 2018-04-08
    相关资源
    最近更新 更多