Настройка тела запроса PUT с помощью PHP

Я пытаюсь использовать spreadsheets.values.update API Google Таблиц (https://developers.google.com/sheets/reference/rest/v4/spreadsheets.values/update) для вставки данных в электронную таблицу.

Я уже получил токен доступа с правильной областью действия, и теперь я пытаюсь отправить запрос PUT через cURL. Я использую оболочку PHP curl (https://github.com/php-curl-class/php-curl-class), но простой PHP тоже подойдет.

Вот что у меня есть на данный момент:

$curl = new Curl();
    $curl->setHeader("Authorization","Bearer ".json_decode($a4e->user->google_token)->access_token);
    $curl->setOpt(CURLOPT_POSTFIELDS, '{"values": [["Elizabeth", "2", "0.5", "60"]]}');
    $curl->put('https://sheets.googleapis.com/v4/spreadsheets/11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc/values/Sheet1!A1', array(
        'valueInputOption' => 'USER_ENTERED'    
    ));

    if ($curl->error) {
        echo 'Error: ' . $curl->errorCode . ': ' . $curl->errorMessage;
    }
    else {
        echo json_encode($curl->response);
    }

Запрос cURL выполняется успешно и возвращает следующее:

{"spreadsheetId": "11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc", "updatedRange": "Sheet1! A1"}

Однако он не обновляет данные в таблице.

Кто-нибудь знает, что я делаю не так? Спасибо заранее.


person praine    schedule 25.06.2016    source источник


Ответы (3)


Я так понимаю, вы успешно прошли аутентификацию с помощью OAuth? Я бы посмотрел на ваш URL-адрес. Вы говорите «Sheet1! A1», но при этом вводите данные, которые выглядят так, как будто они охватывают несколько ячеек. Поэтому я бы попытался настроить «Sheet1! A1», чтобы включить фактическое количество ячеек, поскольку у вас есть много частей данных, которые вы импортируете. Обычно ответ должен выглядеть примерно так, как this. Поскольку в вашем ответе нет последней информации, похоже, что ячейки, которые вы указываете для записи, неверны.

person Charlie Fish    schedule 25.06.2016
comment
Привет, спасибо за комментарий. Да, аутентификация прошла успешно, и я могу без проблем читать данные из той же таблицы. Документы по миграции здесь (developers.google.com/sheets/guides/). say Указанный диапазон должен ссылаться только на первую ячейку в строке; API определяет ячейки для обновления на основе значений, предоставленных с запросом. так что я не думаю, что это должно быть проблемой .. - person praine; 25.06.2016

Вначале:

  • вы вызвали $curl->setOpt(CURLOPT_POSTFIELDS, '{"values": [["Elizabeth", "2", "0.5", "60"]]}');, передавая обычную строку.
    Но параметр curl CURLOPT_POSTFIELDS принимает значение в виде строки с кодировкой URL, например 'para1=val1&para2=val2&...', или ассоциативного массива данных (пары ключ / значение)

Во-вторых:

  • функция put из этой библиотеки (php-curl-class) function put($url, $data = array()) ... рассматривает свой второй аргумент как данные публикации.
    Поскольку вы передали массив данных при вызове метода put - вы перезаписали предыдущие данные публикации, установленные $curl->setOpt(CURLOPT_POSTFIELDS, ....
person RomanPerekhrest    schedule 25.06.2016
comment
Привет, спасибо за помощь. API требует, чтобы был установлен один параметр запроса, valueInputOption, который я пытаюсь установить с помощью второго аргумента в функции php-curl-class. Однако, похоже, также требуется строка в кодировке JSON в ТЕЛЕ запроса PUT .. Я не уверен, как включить оба этих элемента в мой запрос .. - person praine; 25.06.2016
comment
если для этого требуется строка в кодировке JSON в ТЕЛЕ запроса PUT. Вы пытались установить массив array('valueInputOption' => '{"values": [["Elizabeth", "2", "0.5", "60"]]}' )) в качестве второго аргумента функции put? - person RomanPerekhrest; 25.06.2016
comment
valueInputOption должен быть одним из следующих: RAW или USER_ENTERED (согласно: разработчикам. google.com/sheets/reference/rest/v4/ValueInputOption) - person praine; 25.06.2016
comment
Я изменил свой запрос PUT на следующее: $curl->put('https://sheets.googleapis.com/v4/spreadsheets/11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc/values/Sheet1!A1?valueInputOption=USER_ENTERED','{"values": [["Elizabeth", "2", "0.5", "60"]]}'); - запрос cURL выполняется успешно, но данные электронной таблицы по-прежнему не обновляются: - / - person praine; 25.06.2016
comment
также попробуйте установить дополнительный заголовок CURLOPT_HTTPHEADER, указав тип содержимого как json - person RomanPerekhrest; 25.06.2016
comment
Это сработало! Большое спасибо за вашу помощь и предложения! - person praine; 25.06.2016

Хорошо, поэтому я запустил параметры через Postman (https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en) и экспортировал следующий код:

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://sheets.googleapis.com/v4/spreadsheets/11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc/values/Sheet1!A1?valueInputOption=USER_ENTERED",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "PUT",
  CURLOPT_POSTFIELDS => "{\"range\":\"Sheet1!A1\",\"majorDimension\":\"ROWS\",\"values\":[[\"x\",\"x\",\"x\",\"x\",\"x\"]]}",
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer {token}",
    "cache-control: no-cache",
    "content-type: application/json",
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

И наконец-то работает! Content-type: application / json абсолютно необходим, согласно предложению Романа Перехреста. Без него запрос ничего не обновляет.

person praine    schedule 25.06.2016