我有一个错误报告信标我使用Google Apps脚本创建,它发布为我自己运行,并且可以被任何人访问,甚至匿名,"哪个应表示允许向GAS发出X域请求。
但是,我的浏览器现在指示代码发布到信标后响应中没有Access-Control-Allow-Origin
标头。
我在这里遗漏了什么吗?这曾经是两个月前的工作。只要GAS是为公共访问发布的,那么 设置Access-Control-Allow-Origin
标题。
在Google Apps脚本中:
Code.gsfunction doPost(data){
if(data){
//Do Something
}
return ContentService.createTextOutput("{status:'okay'}", ContentService.MimeType.JSON);
}
客户端:
的script.js$.post(beacon_url, data, null, "json");
答案 0 :(得分:17)
在调用contentservice脚本时,我总是发送一个JSONP回调函数。由于GAS不支持CORS,因此这是确保您的应用在x域问题到达时不会中断的唯一可靠方法。
在jQuery中拨打电话只需添加"& callback =?"。它会解决所有其他问题。
var url = "https://script.google.com/macros/s/{YourProjectId}/exec?offset="+offset+"&baseDate="+baseDate+"&callback=?";
$.getJSON( url,function( returnValue ){...});
在服务器端
function doGet(e){
var callback = e.parameter.callback;
//do stuff ...
return ContentService.createTextOutput(callback+'('+ JSON.stringify(returnValue)+')').setMimeType(ContentService.MimeType.JAVASCRIPT);
}
答案 1 :(得分:7)
我因同样的问题而失去了几个小时。解决方案很简单。
当您将脚本部署为webapp时,您将获得两个网址:/dev
和/exec
网址。您应该使用/exec
一个来发出跨域POST请求。 /dev
始终是私有的:它需要被授权,并且不设置* Allow-Origin标头。
PS:/exec
似乎已被冻结 - 在您使用新版本字符串(部署对话框中的下拉列表)手动部署代码之前,它并未反映代码的任何更改。要使用/dev
网址调试最新版本的脚本,只需安装其他浏览器并禁用它的网络安全功能( - 在GoogleChrome中禁用网络安全 )。
答案 2 :(得分:5)
只为那些只对我这样的POST请求感兴趣的人更简单:
function doPost(e){
//do stuff ...
var MyResponse = "It Works!";
return ContentService.createTextOutput(MyResponse).setMimeType(ContentService.MimeType.JAVASCRIPT);
}
答案 3 :(得分:1)
在您的调用应用程序中,只需将 content-type 设置为 text/plain,您就可以将 GAS 返回的 JSON 解析为有效的 json 对象。
这是我的 google 脚本 doPost 函数中的 JSON 对象
var result = {
status: 200,
error: 'None',
rowID: rowID
};
ws.appendRow(rowContents);
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
在这里我从节点 js 调用我的应用程序脚本 API
const requestOptions = {
method: 'POST',
headers: {'Content-Type': 'text/plain'},
body: JSON.stringify({param1: value, param2:value})
};
const response = await fetch(server_URL, requestOptions);
const data = await response.json();
console.log(data);
console.log(data.status);
答案 4 :(得分:0)
我偶然发现了同一问题:
/exec
-URL效果很好我试图避免将POST JSON-clientcode重构为JSONP(我持怀疑态度,因为事情以前总是可以解决的)。
幸运的是, 之后,我做了一个非CORS请求(使用fetch()
在https域中从浏览器中访问了mode: no-cors
),通常的CORS请求都可以正常工作再次。
最后一个解释可能是:每个新的appscript-deployment都需要花费一些时间/使用率,然后才能在服务器级别真正确定其配置。
答案 5 :(得分:0)
我的情况不同,我以一种非常奇怪的方式面对CORS错误。
直到我添加一个常量,我的代码才能正常工作且没有CORS错误:
const MY_CONST = "...";
似乎Google Apps脚本(GAS)不允许使用'const'关键字,因为GAS是基于ES3或ES5之前的版本或类似的东西。关于“ const”的错误将重定向到没有CORS的错误页面网址。
答案 6 :(得分:0)
当我尝试将应用程序脚本应用程序与另一个Vue应用程序集成时,遇到了类似的CORS政策错误问题。
请注意以下配置:
希望这对您有用。
答案 7 :(得分:0)
如果这对所有像我这样的人有帮助:
我有一个 .js 文件,其中包含我所有的实用程序函数,包括调用 GAS 的函数。我在测试更新时总是忘记清除缓存,所以我经常会遇到这种错误,因为缓存的代码使用的是 /dev 链接而不是 /exec 链接。