🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 | |
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! | |
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 | |
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 | |
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 | |
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
在 PHP 中使用 cURL 发送 application/json
类型的 POST 请求,需明确设置请求头和 JSON 数据体。以下是具体方法和完整示例:
基础代码实现
<?php
// 目标 URL
$url = 'https://api.example.com/endpoint';
// 准备要发送的数据(关联数组)
$data = [
'name' => 'John Doe',
'email' => 'john@example.com',
'age' => 30
];
// 将数据转换为 JSON 字符串
$jsonData = json_encode($data);
// 初始化 cURL
$ch = curl_init($url);
// 配置 cURL 选项
curl_setopt_array($ch, [
CURLOPT_POST => true, // 启用 POST
CURLOPT_POSTFIELDS => $jsonData, // 设置 JSON 数据体
CURLOPT_HTTPHEADER => [ // 设置请求头
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
],
CURLOPT_RETURNTRANSFER => true, // 返回响应结果(不直接输出)
CURLOPT_SSL_VERIFYPEER => false // 关闭 SSL 验证(测试环境用)
]);
// 执行请求并获取响应
$response = curl_exec($ch);
// 检查错误
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
}
// 关闭 cURL 资源
curl_close($ch);
// 输出服务器响应
echo $response;
?>
关键配置说明
配置项 | 作用说明 |
---|---|
CURLOPT_POST | 明确指定为 POST 方法(或改用 CURLOPT_CUSTOMREQUEST => 'POST' ) |
CURLOPT_POSTFIELDS | 必须传递 JSON 字符串(若传递数组会自动转为 multipart/form-data ) |
Content-Type 头 | 强制声明内容类型为 application/json |
Content-Length 头 | 可选但推荐,明确数据长度 |
CURLOPT_RETURNTRANSFER | 设为 true 以将响应保存到变量(否则直接输出) |
常见问题处理
1. 数据编码问题
// 处理特殊字符(如中文)
$jsonData = json_encode($data, JSON_UNESCAPED_UNICODE);
2. 添加认证信息
// 在请求头中添加 Token
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer your_token_here'
]);
3. 处理服务器响应
// 解析 JSON 响应
$responseData = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE) {
print_r($responseData);
} else {
echo "响应非 JSON 格式: " . $response;
}
安全建议
-
生产环境启用 SSL 验证
移除CURLOPT_SSL_VERIFYPEER => false
或设为true
(需配置证书)curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
-
超时设置
添加超时限制防止长时间阻塞:curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 10 秒超时
完整封装函数示例
function sendJsonPostRequest($url, $data, $headers = []) {
$jsonData = json_encode($data);
$ch = curl_init($url);
$defaultHeaders = [
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
];
$finalHeaders = array_merge($defaultHeaders, $headers);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $jsonData,
CURLOPT_HTTPHEADER => $finalHeaders,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_CAINFO => '/path/to/cacert.pem'
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
throw new Exception('cURL Error: ' . curl_error($ch));
}
curl_close($ch);
return json_decode($response, true) ?: $response;
}
// 调用示例
try {
$result = sendJsonPostRequest('https://api.example.com', ['key' => 'value'], [
'X-Custom-Header: test'
]);
print_r($result);
} catch (Exception $e) {
echo $e->getMessage();
}
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙