如何使用PHP中的cURL发布到Google脚本并返回文本?

时间:2017-11-19 01:16:30

标签: php curl google-api google-cloud-platform

我正在努力做到最低限度,只是为了让它发挥作用。

这是我的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);

执行此操作时,$resulttrue

如果我取消注释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(),但我需要发送一些超出GET可以处理的大型POST。

如何发布到Google脚本并返回数据?

------更新------

我刚刚学会了我的首席开发人员在不久前尝试了这个并且在返回时结束了doPost()错误,显然这不仅仅是我。我的看法是Google完全不够可靠。我希望有人证明我错了。

------更新2 - 修复---------

显然这就是问题所在:

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

需要:

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

不知道为什么http_build_query()导致错误。

2 个答案:

答案 0 :(得分:3)

尝试阅读CURLOPT_POSTFIELDS的documentation,您会看到要发布文件,请在文件前添加@并使用完整路径。这看起来就是您尝试的内容去做。请注意,在php 5.5中,引入了CURLFile类来发布文件。

如果你使用的是PHP 5.5或更高版本,你可以试试这个:

$url = 'https://script.google.com/a/somedomain.com/macros/s/### script id ###/exec';

// create a CURLFile object:
$cfile = new CURLFile('file.pdf','application/pdf'); // you can also optionally use a third parameter

// your POST data...you may need to add other data here like api keys and stuff
$data = array("fileName" => $cfile);

$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, 1);

// FROM THE DOCS:
// If value is an array, the Content-Type header will be set to multipart/form-data (so you might skip the line above)
// As of PHP 5.2.0, value must be an array if files are passed to this option with the @ prefix
// As of PHP 5.5.0, the @ prefix is deprecated and files can be sent using CURLFile
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

// set this to TRUE if you want curl_exec to retrieve the result
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch);
if ($result === FALSE) {
    echo "The result is FALSE. There was a problem\n";
    $error  = curl_error($ch);
    var_dump($error);
    die();
} else {
    echo "success!\n";
    var_dump($result);
}

// this can give you more information about your request
$info = curl_getinfo($ch);
if ($info === FALSE) {
    echo "curlinfo is FALSE! Something weird happened";
}
var_dump($info); // examine this output for clues

编辑:如果您没有收到任何错误,并且$ result会返回“错误请求”之类的内容,那么您需要更仔细地检查结果找出问题所在。一个表现良好的API应该有信息性的信息来帮助您解决问题。如果API没有告诉你你做错了什么,你可以检查你从这些命令得到的curlinfo:

$info = curl_getinfo($ch);
var_dump($info); // examine this output for clues

如果$ result和$ info没有告诉你你做错了什么,请尝试更仔细地阅读API文档。你可能会在某处找到线索。

如果您无法弄清楚使用这些策略的问题是什么,那么您的代码就无法做到。您需要来自API维护人员的更多信息。

答案 1 :(得分:1)

您需要查看HTTP请求标头以查看实际发布的内容。

遇到问题时我会添加以下选项:

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
curl_setopt($ch, CURLOPT_ENCODING,"");

curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

CURLINFO_HEADER_OUT会将"request_header"添加到curl_getinfo()

您还想查看这些curl_getinfo()元素。

  • request_size
  • size_upload
  • upload_content_length
  • request_header