google api php client — настройка тела запроса PUT с помощью переполнения стека

Я пытаюсь использовать API-интерфейс Google Sheets spreadsheets.values.update (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»: «Лист1 A1»}

Тем не менее, он не обновляет данные в листе.

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

0

Решение

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

1

Другие решения

Вначале:

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

Во-вторых:

  • put функция из этой библиотеки (php-curl-class) function
    put($url, $data = array()) ...
    считает свой второй аргумент постом
    данные.
    Как вы передали в массив данных при вызове put метод — вы перезаписали данные предыдущего поста, установленные $curl->setOpt(CURLOPT_POSTFIELDS, ....
1

Ок, так я запускал параметры через почтальона (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;
}

И это наконец работает! Тип контента: application / json абсолютно необходим, согласно предложению RomanPerekhrest. Запрос ничего не обновляет без него.

0
По вопросам рекламы [email protected]