[英]Setting PUT request body with PHP
我正在尝试使用Google Sheets API的电子表格sheets.values.update( https://developers.google.com/sheets/reference/rest/v4/spreadsheets.values/update )方法将数据插入电子表格中。
我已经获取了正确范围的访问令牌,现在我正尝试通过cURL发送一个PUT请求。 我正在使用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”}
但是,它不会更新工作表中的数据。
有人知道我在做什么错吗? 提前谢谢了。
我认为您已成功使用OAuth进行身份验证? 我会调查您的put URL。 您说的是“ Sheet1!A1”,但您正在输入的数据看起来将跨越多个单元格。 因此,我将尝试调整“ Sheet1!A1”以包括实际的单元格范围,因为您要导入的数据很多。 通常,响应应与此相似。 由于响应中没有任何最后信息,因此您指定要写入的单元格看起来不正确。
首先:
$curl->setOpt(CURLOPT_POSTFIELDS, '{"values": [["Elizabeth", "2", "0.5", "60"]]}');
传递常规字符串。 CURLOPT_POSTFIELDS
选项接受它的值是诸如'para1=val1¶2=val2&...'
类'para1=val1¶2=val2&...'
urlencoded字符串或数据(键/值对)的关联数组 其次:
put
函数( php-curl-class
) function put($url, $data = array()) ...
将其第二个参数视为发布数据。 put
方法时传递数据数组时-您已经覆盖了$curl->setOpt(CURLOPT_POSTFIELDS, ....
好的,因此我通过Postman( https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbbcdddomop?hl=zh_CN )运行了参数,并导出了以下代码:
$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;
}
终于成功了! 根据RomanPerekhrest的建议,内容类型:application / json是绝对必要的。 没有它,请求不会更新任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.