使用 PHP 设置 PUT 请求正文
Setting PUT request body with PHP
我正在尝试使用 Google Sheets API 的 spreadsheets.values.update (https://developers.google.com/sheets/reference/rest/v4/spreadsheets.values/update) 方法将数据插入到 spreadsheet 中。
我已经获得了范围正确的访问令牌,现在我正在尝试通过 cURL 发送 PUT 请求。我正在使用 PHP 卷曲包装器 (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 请求执行成功,returns以下内容:
{"spreadsheetId":"11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc","updatedRange":"Sheet1!A1"}
但是,它不会更新 sheet 中的数据。
有谁知道我做错了什么?
非常感谢。
我想你已经成功使用 OAuth 进行了身份验证?我会查看您的 URL。你说的是 "Sheet1!A1" 但你输入的数据看起来像是跨越多个单元格。因此,我会尝试调整 "Sheet1!A1" 以包含实际的单元格范围,因为您要导入许多数据。通常,响应应类似于 this。因为它在您的响应中没有任何最后的信息,所以您指定要写入的单元格似乎不正确。
最初:
- 您已调用
$curl->setOpt(CURLOPT_POSTFIELDS, '{"values":
[["Elizabeth", "2", "0.5", "60"]]}');
并传入一个常规字符串。
但是 curl CURLOPT_POSTFIELDS
选项接受它的价值是
urlencoded 字符串,如 'para1=val1¶2=val2&...'
或
数据的关联数组(key/value 对)
其次:
- 该库中的
put
函数 (php-curl-class
) function
put($url, $data = array()) ...
将其第二个参数视为 post
data.
当您在调用 put
方法时传入了一个数据数组 - 您已经覆盖了之前由 $curl->setOpt(CURLOPT_POSTFIELDS, ....
设置的 post 数据
OK,所以我 运行 通过 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;
}
终于成功了!根据 RomanPerekhrest 的建议,content-type: application/json 是绝对必要的。没有它,请求不会更新任何内容。
我正在尝试使用 Google Sheets API 的 spreadsheets.values.update (https://developers.google.com/sheets/reference/rest/v4/spreadsheets.values/update) 方法将数据插入到 spreadsheet 中。
我已经获得了范围正确的访问令牌,现在我正在尝试通过 cURL 发送 PUT 请求。我正在使用 PHP 卷曲包装器 (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 请求执行成功,returns以下内容:
{"spreadsheetId":"11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc","updatedRange":"Sheet1!A1"}
但是,它不会更新 sheet 中的数据。
有谁知道我做错了什么? 非常感谢。
我想你已经成功使用 OAuth 进行了身份验证?我会查看您的 URL。你说的是 "Sheet1!A1" 但你输入的数据看起来像是跨越多个单元格。因此,我会尝试调整 "Sheet1!A1" 以包含实际的单元格范围,因为您要导入许多数据。通常,响应应类似于 this。因为它在您的响应中没有任何最后的信息,所以您指定要写入的单元格似乎不正确。
最初:
- 您已调用
$curl->setOpt(CURLOPT_POSTFIELDS, '{"values": [["Elizabeth", "2", "0.5", "60"]]}');
并传入一个常规字符串。
但是 curlCURLOPT_POSTFIELDS
选项接受它的价值是 urlencoded 字符串,如'para1=val1¶2=val2&...'
或 数据的关联数组(key/value 对)
其次:
- 该库中的
put
函数 (php-curl-class
)function put($url, $data = array()) ...
将其第二个参数视为 post data.
当您在调用put
方法时传入了一个数据数组 - 您已经覆盖了之前由$curl->setOpt(CURLOPT_POSTFIELDS, ....
设置的 post 数据
OK,所以我 运行 通过 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;
}
终于成功了!根据 RomanPerekhrest 的建议,content-type: application/json 是绝对必要的。没有它,请求不会更新任何内容。