我正在尝试使用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设置为什么?