【问题标题】:Setting PUT request body with PHP使用 PHP 设置 PUT 请求正文
【发布时间】:2016-06-25 15:24:26
【问题描述】:

我正在尝试使用 Google Sheets API 的电子表格.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"}

但是,它不会更新工作表中的数据。

有谁知道我做错了什么? 非常感谢。

【问题讨论】:

    标签: php google-api-php-client google-sheets-api


    【解决方案1】:

    我认为您已成功使用 OAuth 进行身份验证?我会查看您的放置网址。您说的是“Sheet1!A1”,但您输入的数据看起来会跨越多个单元格。所以我会尝试调整“Sheet1!A1”以包含实际的单元格,因为您有很多要导入的数据。通常响应应该类似于this。因为它在您的响应中没有任何最后的信息,所以您指定写入的单元格看起来不正确。

    【讨论】:

    • 您好,感谢您的评论。是的,身份验证成功,我可以毫无问题地从同一个电子表格中读取数据。此处的迁移文档 (developers.google.com/sheets/guides/…) 说“指定的范围只需要引用行中的第一个单元格;API 会根据请求提供的值推断要更新的单元格。”所以我不认为这应该是一个问题..
    【解决方案2】:

    起初:

    • 您调用了$curl->setOpt(CURLOPT_POSTFIELDS, '{"values": [["Elizabeth", "2", "0.5", "60"]]}');,传入了一个常规字符串。
      但是 curl CURLOPT_POSTFIELDS 选项接受它的价值是 urlencoded 字符串,例如 'para1=val1&para2=val2&...' 或 数据关联数组(键/值对)

    其次:

    • 该库中的put 函数(php-curl-class) function put($url, $data = array()) ... 将其第二个参数视为post 数据。
      当您在调用 put 方法时传入了一个数据数组 - 您已经覆盖了 $curl->setOpt(CURLOPT_POSTFIELDS, .... 之前设置的帖子数据

    【讨论】:

    • 您好,感谢您的帮助。 API 需要设置一个查询参数“valueInputOption”,我试图使用 php-curl-class 函数中的第二个参数来设置它。但是,它似乎还需要在 PUT 请求的 BODY 中使用 JSON 编码的字符串。我不确定如何在我的请求中包含这两个元素。
    • 如果它“在 PUT 请求的 BODY 中需要一个 JSON 编码的字符串”。您是否尝试将数组 array('valueInputOption' => '{"values": [["Elizabeth", "2", "0.5", "60"]]}' )) 设置为 put 函数的第二个参数?
    • "valueInputOption" 必须是以下之一:“RAW”或“USER_ENTERED”(根据:developers.google.com/sheets/reference/rest/v4/ValueInputOption
    • 我已将 PUT 请求更改为以下内容:$curl->put('https://sheets.googleapis.com/v4/spreadsheets/11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc/values/Sheet1!A1?valueInputOption=USER_ENTERED','{"values": [["Elizabeth", "2", "0.5", "60"]]}'); - cURL 请求成功执行,但电子表格数据仍未更新:-/
    • 另外,尝试设置附加标头CURLOPT_HTTPHEADER,指定内容类型为json
    【解决方案3】:

    好的,所以我通过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 是绝对必要的。没有它,请求不会更新任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多