如何将带Bearer认证的命令行Curl POST JSON请求转换为可运行PHP代码
与原curl命令逻辑完全对齐的可运行PHP实现
缺失项补全说明
对照你原shell中可正常运行的curl命令,你最初编写的PHP代码存在多个会导致请求失败的缺失项,逐一补全后即可实现完全一致的请求效果:
- 原curl带
-k参数表示跳过HTTPS证书校验,PHP端没有对应配置,会直接触发证书验证失败 - 原curl带
Authorization: Bearer fc68946e-6b31-45ba-9006-d3519a9e1464的请求头,PHP端完全没有传递该参数,会被接口鉴权拦截 - 原代码中用单引号包裹的内容不是合法JSON格式,shell环境下curl能正常传递是因为shell的参数解析特性,PHP端直接发送这类内容会被接口的JSON格式校验拦截
- 原curl带
-i参数表示返回结果中包含响应头信息,PHP端未开启对应配置,返回内容和原curl不一致
可直接运行的完整代码
<?php $url = "https://10.10.9.239:8443/restAPI/online_report"; // 用数组构造请求参数,转成标准合法JSON,避免单引号导致的格式错误 $requestData = [ 'reportName' => 'Aggregation/Archive Log', 'indexFrom' => '1', 'reportParameter' => [ 'QUERY_FROM_DATE' => 'NOW -30 MONTH', 'QUERY_TO_DATE' => 'NOW', 'SQLGuardHostName' => '%', 'SHOW_ALIASES' => 'TRUE', 'REMOTE_SOURCE' => '%' ] ]; $data_json = json_encode($requestData, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // 对应原curl的-k参数:关闭SSL证书校验 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 完整配置原curl要求的所有请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Authorization: Bearer fc68946e-6b31-45ba-9006-d3519a9e1464' ]); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json); // 对应原curl的-i参数:返回内容中包含响应头 curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); // 增加错误捕获,方便定位请求问题 if (curl_errno($ch)) { echo "请求执行错误:" . curl_error($ch); } curl_close($ch); echo $response; ?>
补充说明
- 如果不需要和原curl一样返回响应头,将
CURLOPT_HEADER的参数值改为false即可,不影响接口请求逻辑。 - 用数组构造参数再转JSON的方式,能避免手动写JSON时的引号格式错误,是PHP端发送JSON请求的通用稳妥写法。
内容的提问来源于stack exchange,提问作者Seyhan
相关产品推荐
相关产品推荐

