如何将JSON_ENCODE变量放入CURLOPT_POSTFIELDS?

时间:2019-08-09 18:10:33

标签: php json curl

我正在尝试使用PHP curl将数据发布到API。当我手动将json_encoded输出粘贴到代码中时,它可以正常工作,但是当我通过变量分配时,会从API中收到错误400错误语法。

我尝试操纵变量以确保它与已知的工作字符串相同,但是错误日志中的打印输出显示出转义的反斜杠仍然存在。

//Get the data
$sql = "SELECT name, date, amount FROM table";
$result = mysqli_query($conn, $sql);

//Convert the output to JSON format
$rows = array();

while($r = mysqli_fetch_assoc($result)) {

    $rows[] = $r;
}

$encodedJSON = json_encode($rows, JSON_NUMERIC_CHECK);

if (mysqli_num_rows($result) == 1) {
    $encodedJSON = '{ "single": ' . $encodedJSON . ' }';
} else {
    $encodedJSON = '{ "multiple": ' . $encodedJSON . ' }';  
}

$access_token = 'Bearer ' . $access_token;
$encodedJSON = addslashes($encodedJSON);            
error_log($encodedJSON);

//Start Curl        
$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => $encodedJSON,
    CURLOPT_HTTPHEADER => array(
      "Accept-Encoding: gzip, deflate",
      "Authorization: " . $access_token,
      "Cache-Control: no-cache",
      "Connection: keep-alive",
      "Content-Length: 354",
      "Content-Type: application/json",
      "accept: application/json",
      "cache-control: no-cache"
    ),
  ));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
} 

我怀疑这里有一个反斜杠问题,但我无法解决。

$ encodedJSON输出到error_log。当我检查error_log文件时,我可以看到字符串输出如下:

"{ \"multiple\": [{\"name\":\"Joe Bloggs\",\"date\":\"2019-08-06\",\"amount\":34},{\"name\":\"Bloggy Joe\",\"date\":\"2019-08-07\",\"amount\":237}] }"

奇怪的是,如果我复制/粘贴此确切的字符串并将其硬编码为新变量-假设$HARDencodedJSON

$HARDencodedJSON = "{ \"multiple\": [{\"name\":\"Joe Bloggs\",\"date\":\"2019-08-06\",\"amount\":34},{\"name\":\"Bloggy Joe\",\"date\":\"2019-08-07\",\"amount\":237}] }";

然后将其输出到错误日志,如下所示:

{ "multiple": [{"name":"Joe Bloggs","date":"2019-08-06","amount":34},{"name":"Bloggy Joe","date":"2019-08-07","amount":237}] }

换句话说,反斜杠从硬编码变量中去除,但仍保留在原始斜杠中。

同样,如果我将CURLOPT_POSTFIELDS => $encodedJSON换成CURLOPT_POSTFIELDS => $HARDencodedJSON,那么整个过程就很好。

已更新: 我仍然很困惑,有人可以帮忙吗?

使用以下代码,我可以在error_log中获得看起来完全正确的输出,但是cURL超时:

$encodedJSON = json_encode(array("multiple"=>$rows),JSON_NUMERIC_CHECK);

我已删除了添加斜杠,因此不再需要进一步的字符串操作。

然后我只需将变量添加到我的cURL设置中,如下所示:

CURLOPT_POSTFIELDS => $encodedJSON,

响应是一个cURL超时,如下所示: cURL错误#:30000毫秒后操作超时,收到了0个字节

如果我再加上斜线,则cURL不再超时,并且API端点将响应并显示错误400 Bad Request。

有什么办法可以查看发送过来的确切cURL命令吗?我已经尝试了详细的调试,但没有确切显示CURLOPT_POSTFIELDS设置为什么?

0 个答案:

没有答案