【发布时间】:2018-05-02 12:55:13
【问题描述】:
我正在尝试做最低限度的工作,只是为了让它发挥作用。
这是我的 Google 脚本:
function doPost(e) {
return ContentService.createTextOutput(JSON.stringify(e.parameter));
}
这是我的 PHP 代码:
$url = 'https://script.google.com/a/somedomain.com/macros/s/### script id ###/exec';
$data['name'] = "Joe";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch);
$error = curl_error($ch);
执行这个,$result 是true。
如果我取消注释 CURLOPT_RETURNTRANSFER 行,$result =
<HTML>
<HEAD>
<TITLE>Bad Request</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Bad Request</H1>
<H2>Error 400</H2>
</BODY>
</HTML>
$error 始终为空。
我会使用doGet(),但我需要发送一些相当大的 POST,这将超出 GET 的处理能力。
如何发布到 Google 脚本并返回数据?
----- 更新 ------
我刚刚得知我的首席开发人员前段时间尝试过此操作,并在返回时得出了 doPost() 错误,因此显然不仅仅是我。我的看法是,谷歌根本不够可靠,无法使用。我希望有人能证明我错了。
----- 更新 2 - 修复 ---------
显然这是问题所在:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
需要:
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
不知道为什么http_build_query() 导致它出错。
【问题讨论】:
-
我猜
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));是罪魁祸首。这不应该是需要的。 CURL 会根据作为查询字符串或数组的发布数据将正确的类型放入标头本身。它可以与没有此标头选项的查询字符串一起使用。 -
使用查询字符串时,标题应为:
application/x-www-form-urlencoded当数组时,标题应为:multipart/form-data
标签: php curl google-api google-cloud-platform