我正尝试将Google Apps脚本部署为网络应用,但是尽管我对执行GET请求没有问题,但在POST请求方面遇到了麻烦。
我的代码很简单:
function doGet(request) {
var result = JSON.stringify({ data: 'Thanks, I received the GET request' });
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}
function doPost(request) {
var result = JSON.stringify({ data: 'Thanks, I received the POST request' });
return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}
我通过“将应用程序执行为:我”和“谁有权访问该应用程序:任何人,甚至是匿名用户”来部署该Web应用程序。每次进行一些更改时,我都会重新部署一个新版本(“项目版本:新”)。
发布后,我的curl GET请求可以正常运行:
> curl -L https://script.google.com/macros/s/$SCRIPT_ID/exec
{"data":"Thanks, I received the GET request"}
但是,我的POST请求(curl -L -XPOST https://script.google.com/macros/s/$SCRIPT_ID/exec
)仅向我显示了一个通用的Google HTML页面,上面写着“抱歉,暂时无法打开文件。请检查地址,然后重试”。
我尝试发送一些数据并提供内容类型,但没有任何变化。我还尝试将输出类型更改为ContentService.createTextOutput("OK")
,但是它也不起作用。奇怪的是,删除doPost
会将错误消息更改为“找不到脚本功能:doPost”。如果有什么不同,此脚本将附加到Google电子表格中。
我是否需要为POST请求的脚本赋予特殊的权限?
答案 0 :(得分:2)
似乎问题出在我使用curl时,使用-XPOST
与不使用之间存在细微的差别。正如Tanaike所建议,更改为:
curl -L -XPOST https://script.google.com/macros/s/$SCRIPT_ID/exec
到
curl -L -d '' https://script.google.com/macros/s/$SCRIPT_ID/exec
解决了该问题。即使curl在我使用-XPOST
和有效负载进行请求时,虽然curl有用地表示“不必要使用-X或--request,但已经推断出POST”,但在存在重定向的情况下其行为是不同的。 -XPOST
强制使用POST作为方法进行重定向后的所有后续请求。另一方面,如果我未指定-XPOST
,则第一个POST之后的请求将作为GET请求发出。我不知道这是否是curl的预期行为,但这肯定是不直观的。