繁体   English   中英

使用PHP设置PUT请求主体

[英]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"]]}'); 传递常规字符串。
    但是curl CURLOPT_POSTFIELDS选项接受它的值是诸如'para1=val1&para2=val2&...''para1=val1&para2=val2&...' urlencoded字符串或数据(键/值对)的关联数组

其次:

  • 该库中的put函数( php-curl-classfunction 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM