如何通过PHP的curl_exec实现带自定义请求头的JSON POST请求
可直接运行的PHP cURL实现代码
<?php // 目标接口地址,和原curl命令的请求地址保持一致 $apiUrl = 'https://api.mydomain.in/api/comm/wa/send/text'; // 构造请求参数,和原--data-raw里的参数完全对应 $requestParams = [ 'phone' => '8822992929', 'ID' => 26, 'text' => 'Dear Customer. Thank you for your purchase. ' ]; // 转换为标准JSON字符串,匹配Content-Type要求 $jsonPayload = json_encode($requestParams, JSON_UNESCAPED_UNICODE); // 初始化cURL会话 $ch = curl_init($apiUrl); // 批量配置cURL参数 curl_setopt_array($ch, [ // 标记为POST请求,对应原命令的--request POST CURLOPT_POST => true, // 将接口返回内容作为函数返回值,不直接输出到页面 CURLOPT_RETURNTRANSFER => true, // 传入POST请求体,对应原命令的--data-raw CURLOPT_POSTFIELDS => $jsonPayload, // 传入自定义请求头,对应原命令的--header配置 CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'token: xyz123456' ], // 自动跟随重定向,对应原命令的--location参数 CURLOPT_FOLLOWLOCATION => true, // 通用超时配置,避免脚本无意义阻塞 CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 5 ]); // 执行请求 $response = curl_exec($ch); // 获取cURL执行阶段的错误信息 $errorMsg = curl_error($ch); // 获取接口返回的HTTP状态码 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 关闭cURL会话释放资源 curl_close($ch); // 结果处理 if ($errorMsg) { echo "请求执行失败:" . $errorMsg; } else { echo "接口响应状态码:" . $httpCode . "<br>"; echo "接口返回内容:" . $response; } ?>
原curl命令与PHP cURL配置的对应说明
- 原命令的目标URL:直接作为
curl_init()的入参即可,保持和原地址完全一致 - 原命令的
--location参数:对应配置项CURLOPT_FOLLOWLOCATION = true,作用是自动跟随接口返回的301/302重定向,和原命令的行为完全对齐 - 原命令的
--request POST声明:对应配置项CURLOPT_POST = true,标记本次请求为POST方法 - 原命令的
--header请求头:所有自定义头需要组成字符串数组,传入CURLOPT_HTTPHEADER配置项,这里要注意头内容一字不差,不要随意修改大小写、冒号后的空格,否则可能被接口鉴权拒绝 - 原命令的
--data-raw请求体:不要直接把PHP数组传给CURLOPT_POSTFIELDS,否则PHP会自动把请求格式改成multipart/form-data,和接口要求的application/json格式不匹配,必然导致请求失败。正确做法是将参数数组通过json_encode()转成标准JSON字符串后,再赋值给该配置项,同时建议加上JSON_UNESCAPED_UNICODE参数,避免未来传入中文时出现转义异常。
调试小技巧:可以在请求执行后打印
$httpCode和$response,直接定位是请求格式错了、鉴权失败还是接口业务逻辑报错。
内容的提问来源于stack exchange,提问作者charak
相关产品推荐
相关产品推荐

