Я пытаюсь сделать минимум, просто чтобы заставить его работать.
Вот мой скрипт 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 () при возвращении, так что, по-видимому, это не только я. Я считаю, что Google просто недостаточно надежна для использования. Мне бы хотелось, чтобы кто-то доказал, что я неправ.
—— ОБНОВЛЕНИЕ 2 – ИСПРАВЛЕНИЕ ———
По-видимому, это была проблема:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
должно быть:
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
Не знаю, почему http_build_query()
вызвало ошибку.
Вам нужно посмотреть заголовок 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 ().
Попробуйте прочитать документацию для CURLOPT_POSTFIELDS, и вы увидите, что сказано, что для публикации файла добавьте имя файла с помощью @ и используйте полный путь. Это похоже на то, что вы пытаетесь сделать. Обратите внимание, что в 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
EDIT: Если вы не получаете никаких ошибок, а результат $ возвращается с чем-то вроде « Bad Request », вам нужно будет более точно проверить результат, чтобы узнать, в чем проблема. Хороший API должен иметь информативную информацию, которая поможет вам решить проблему. Если API не говорит вам, что вы сделали неправильно, вы можете изучить curlinfo, который вы получаете из этих команд:
$info = curl_getinfo($ch); var_dump($info); // examine this output for clues
если $ result и $ info не сообщают вам, что вы сделали неправильно, попробуйте прочитать документацию API более внимательно. Вы можете найти ключ где-то там.
Если вы не можете понять, что проблема использует эти тактики, вы не можете многое сделать с вашим кодом. Вам понадобится дополнительная информация от разработчиков API.