在 PHP 开发过程中,经常需要调用外部服务,例如:
- 支付接口
- 短信接口
- 数据接口
- AI API
- 文件处理服务
- 在线工具 API
这些服务大多数通过 HTTP 协议进行通信,因此 PHP 发送 GET 和 POST 请求是非常常见的开发需求。
PHP 中发送 HTTP 请求有多种方式:
file_get_contents()stream_context_create()cURL
在实际项目开发中,cURL 是 PHP 中最常用的 HTTP 请求方式,因为它功能更加完善,可以支持:
- GET 请求
- POST 请求
- 自定义请求头
- HTTPS
- Cookie
- 超时控制
- 文件上传
- 获取 HTTP 状态码
一、PHP 使用 cURL 发送 GET 请求
最简单的 GET 请求:
<?php$url="https://example.com/";$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);$response=curl_exec($ch);curl_close($ch);echo$response;其中:
| 参数 | 作用 |
|---|---|
| CURLOPT_URL | 设置请求地址 |
| CURLOPT_RETURNTRANSFER | 返回结果,而不是直接输出 |
CURLOPT_RETURNTRANSFER可以让 cURL 返回服务器响应内容,而不是直接输出。
二、封装 PHP GET 请求函数
在实际项目中,不建议每次调用接口都重复编写 cURL 代码,因此通常会封装一个通用 GET 方法。
/** * 发送 GET 请求 * * @param string $url 请求地址 * @param array $params GET参数 * @param array $headers 请求头 * @param int $timeout 超时时间 * * @return string|false */functionhttp_get($url,$params=[],$headers=[],$timeout=10){if(!empty($params)){$query=http_build_query($params);$url.=(strpos($url,'?')===false?'?':'&').$query;}$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);if(!empty($headers)){curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);}curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);$result=curl_exec($ch);if(curl_errno($ch)){$result=false;}curl_close($ch);return$result;}GET 请求调用示例
例如调用某个API生成服务:
$result=http_get("https://example.com",["type"=>"addition","limit"=>100]);echo$result;最终请求:
https://example.com?type=addition&limit=100GET 请求通常用于:
- 获取数据
- 查询资源
- 获取配置
三、PHP 发送 POST 请求
POST 请求主要用于向服务器提交数据,例如:
- 用户登录
- 注册提交
- 创建订单
- 数据生成
- 表单提交
基础 POST 示例:
<?php$url="https://example.com";$data=["type"=>"addition","limit"=>100];$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_POST,true);curl_setopt($ch,CURLOPT_POSTFIELDS,$data);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);$response=curl_exec($ch);curl_close($ch);echo$response;四、封装 PHP POST 请求函数
实际项目中可以封装:
/** * 发送 POST 请求 * * @param string $url 请求地址 * @param array|string $data 请求数据 * @param array $headers 请求头 * @param int $timeout 超时时间 * * @return string|false */functionhttp_post($url,$data=[],$headers=[],$timeout=10){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_POST,true);curl_setopt($ch,CURLOPT_POSTFIELDS,$data);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);if(!empty($headers)){curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);}curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);$result=curl_exec($ch);if(curl_errno($ch)){$result=false;}curl_close($ch);return$result;}五、POST 请求使用方法
1. 普通表单 POST
下面以一个真实API请求为例
$result=http_post("https://www.wativate.com/?api",["type"=>"addition","limit"=>100]);echo$result;发送数据:
type=addition limit=100接口返回:
{"success":true,"count":100,"data":[]}解析 JSON:
$data=json_decode($result,true);print_r($data);将会得到目标网站的真实API请求结果
2. 发送 JSON 数据
很多现代 API 使用 JSON 格式。
JSON 数据:
{"type":"addition","limit":100}PHP 调用:
$result=http_post("https://example.com",json_encode(["type"=>"addition","limit"=>100]),["Content-Type: application/json"]);echo$result;请求头:
Content-Type: application/json请求正文:
{"type":"addition","limit":100}需要注意:
是否支持 JSON 请求,需要根据具体 API 文档决定。
六、获取 HTTP 状态码
调用接口时,除了返回数据,还需要判断 HTTP 请求状态。
获取状态码:
curl_getinfo($ch,CURLINFO_HTTP_CODE);例如:
$response=curl_exec($ch);$status=curl_getinfo($ch,CURLINFO_HTTP_CODE);常见 HTTP 状态码:
| 状态码 | 说明 |
|---|---|
| 200 | 请求成功 |
| 400 | 参数错误 |
| 401 | 身份认证失败 |
| 403 | 禁止访问 |
| 404 | 接口不存在 |
| 500 | 服务器错误 |
七、封装统一 HTTP 请求函数
如果项目中 GET 和 POST 请求较多,可以进一步统一。
通过统一封装,可以减少重复代码,并方便后续增加:
- Token 认证
- 请求日志
- 自动重试
- API 签名
- 错误处理
示例:
functionhttp_request($method,$url,$data=[],$headers=[]){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);if($method==="POST"){curl_setopt($ch,CURLOPT_POST,true);curl_setopt($ch,CURLOPT_POSTFIELDS,$data);}if(!empty($headers)){curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);}$body=curl_exec($ch);$code=curl_getinfo($ch,CURLINFO_HTTP_CODE);curl_close($ch);return["code"=>$code,"body"=>$body];}调用:
$result=http_request("POST","https://example.com",["type"=>"addition","limit"=>100]);print_r($result);返回:
Array([code]=>200[body]=>{"success":true})八、PHP cURL 开发注意事项
1. 不要关闭 HTTPS 验证
很多示例中会看到:
CURLOPT_SSL_VERIFYPEER,false这种写法。
测试环境中,如果遇到 SSL 证书问题,可以临时关闭验证。
但是生产环境建议:
CURLOPT_SSL_VERIFYPEER,true避免 HTTPS 通信安全风险。
2. 设置合理超时时间
接口请求不能无限等待:
CURLOPT_TIMEOUT常见设置:
- 普通 API 请求:5~10 秒
- 文件上传:30 秒以上
如果没有设置超时时间,当远程服务器响应异常时,PHP 进程可能长期等待。
3. 记录接口错误
请求失败时,可以通过:
curl_error($ch);获取错误信息。
常见问题:
- 网络错误
- SSL 错误
- DNS 错误
- 服务器异常
在开发环境中,建议记录这些错误日志,方便快速定位问题。
九、完整调用示例
下面演示一个完整 API 调用流程。
$response=http_post("https://example.com",["type"=>"addition","limit"=>100]);if($response===false){exit("接口请求失败");}$data=json_decode($response,true);print_r($data);执行流程:
PHP程序 | | ↓ http_post() | | ↓ 发送 POST 请求 | | ↓ API | | ↓ 返回 JSON 数据 | | ↓ json_decode() | | ↓ PHP数组PHP 调用 HTTP API 时,推荐使用 cURL,并进行统一封装。
常见结构:
http_get() | |-- GET 请求 http_post() | |-- 普通 POST |-- JSON POST http_request() | |-- 统一 HTTP 客户端通过封装 GET 和 POST 方法,可以让 PHP 项目中的接口调用更加规范,提高代码复用性和维护效率。