不允许使用选项方法,CORS到Google云端硬盘

时间:2015-05-20 12:17:48

标签: javascript jquery cors google-docs

我为谷歌驱动器创建了一个帖子,该帖子发布到this document

我用

调用它
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是“Method not allowed”,当我检查网络流量时,我看到我的本地请求方法是

Request Method:OPTIONS

然而,对于jsFiddle中的那个,它按预期发布。我已经做了一些研究,看起来好像选项是跨越原点的预检请求,我不能让它直接使用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如何通过?我可以以某种方式让它跳过选项并直接发布吗?

1 个答案:

答案 0 :(得分:4)

预检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指定一个简单值。您可以通过向$ .ajax选项对象添加显式contentType: "application/x-www-form-urlencoded; charset=UTF-8"属性来执行此操作。