我为谷歌驱动器创建了一个帖子,该帖子发布到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如何通过?我可以以某种方式让它跳过选项并直接发布吗?
答案 0 :(得分:4)
预检OPTIONS请求在请求非简单时发生,由非简单标头或非简单HTTP方法引起。
access-control-request-headers: accept, content-type
标头表示您尝试发送非简单标头。 Accept
总是很简单,但Content-Type
只有值application/x-www-form-urlencoded
,multipart/form-data
或text/plain
时才会很简单。必须是您的代码(无论出于何种原因)尝试使用Content-Type
的非简单值,并且Google未提供Access-Control-Allow-Headers
响应标头以允许它。
相反,您必须为Content-Type
指定一个简单值。您可以通过向$ .ajax选项对象添加显式contentType: "application/x-www-form-urlencoded; charset=UTF-8"
属性来执行此操作。