PHP cURL发送POST
PHP cURL发送POST
引言
后端对接第三方接口、登录模拟、提交表单,PHP最常用cURL扩展发HTTP请求。file_get_contents只能简单GET,cURL能控制POST、请求头、Cookie、超时和错误处理,是对接API的标配。
基础POST表单
$ch = curl_init('https://api.example.com/login');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'username' => 'user01',
'password' => '123456',
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 结果返回字符串而非直接输出
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$res = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);
POSTFIELDS传数组即multipart表单,接口收到的是form-data。
发送JSON
对接REST接口要手动编码并声明头:
$json = json_encode(['name' => '测试', 'age' => 18]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $token,
]);
注意JSON方式POSTFIELDS传字符串,别传数组。
带Cookie维持登录
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // 第一次保存
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // 第二次读取
模拟登录再访问需鉴权页面时,用cookie文件维持会话。
错误与状态码处理
if ($err) { echo '请求失败:' . $err; }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$data = json_decode($res, true);
别只看返回体,必须判断$code和curl_error,500/404也要处理。
注意事项
- 关SSL校验仅限本地测试,生产保留CURLOPT_SSL_VERIFYPEER;
- 超时必须设,防止接口慢拖垮进程;
- HTTPS证书异常先排查证书链,别长期关闭校验;
- 敏感token放请求头,别写进URL参数;
- 用完curl_close释放句柄。
总结
cURL POST先init,设CURLOPT_POST和POSTFIELDS,表单传数组、JSON传字符串并带头,RETURNTRANSFER取回结果,配合超时、错误判断和状态码,生产保留SSL校验。掌握这套就能稳定对接绝大多数第三方API。