
在 PHP 开发过程中经常需要调用外部服务例如支付接口短信接口数据接口AI API文件处理服务在线工具 API这些服务大多数通过 HTTP 协议进行通信因此 PHP 发送 GET 和 POST 请求是非常常见的开发需求。PHP 中发送 HTTP 请求有多种方式file_get_contents()stream_context_create()cURL在实际项目开发中cURL 是 PHP 中最常用的 HTTP 请求方式因为它功能更加完善可以支持GET 请求POST 请求自定义请求头HTTPSCookie超时控制文件上传获取 HTTP 状态码一、PHP 使用 cURL 发送 GET 请求最简单的 GET 请求?php$urlhttps://example.com/;$chcurl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);$responsecurl_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[],$timeout10){if(!empty($params)){$queryhttp_build_query($params);$url.(strpos($url,?)false??:).$query;}$chcurl_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);$resultcurl_exec($ch);if(curl_errno($ch)){$resultfalse;}curl_close($ch);return$result;}GET 请求调用示例例如调用某个API生成服务$resulthttp_get(https://example.com,[typeaddition,limit100]);echo$result;最终请求https://example.com?typeadditionlimit100GET 请求通常用于获取数据查询资源获取配置三、PHP 发送 POST 请求POST 请求主要用于向服务器提交数据例如用户登录注册提交创建订单数据生成表单提交基础 POST 示例?php$urlhttps://example.com;$data[typeaddition,limit100];$chcurl_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);$responsecurl_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[],$timeout10){$chcurl_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);$resultcurl_exec($ch);if(curl_errno($ch)){$resultfalse;}curl_close($ch);return$result;}五、POST 请求使用方法1. 普通表单 POST下面以一个真实API请求为例$resulthttp_post(https://www.wativate.com/?api,[typeaddition,limit100]);echo$result;发送数据typeaddition limit100接口返回{success:true,count:100,data:[]}解析 JSON$datajson_decode($result,true);print_r($data);将会得到目标网站的真实API请求结果2. 发送 JSON 数据很多现代 API 使用 JSON 格式。JSON 数据{type:addition,limit:100}PHP 调用$resulthttp_post(https://example.com,json_encode([typeaddition,limit100]),[Content-Type: application/json]);echo$result;请求头Content-Type: application/json请求正文{type:addition,limit:100}需要注意是否支持 JSON 请求需要根据具体 API 文档决定。六、获取 HTTP 状态码调用接口时除了返回数据还需要判断 HTTP 请求状态。获取状态码curl_getinfo($ch,CURLINFO_HTTP_CODE);例如$responsecurl_exec($ch);$statuscurl_getinfo($ch,CURLINFO_HTTP_CODE);常见 HTTP 状态码状态码说明200请求成功400参数错误401身份认证失败403禁止访问404接口不存在500服务器错误七、封装统一 HTTP 请求函数如果项目中 GET 和 POST 请求较多可以进一步统一。通过统一封装可以减少重复代码并方便后续增加Token 认证请求日志自动重试API 签名错误处理示例functionhttp_request($method,$url,$data[],$headers[]){$chcurl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);if($methodPOST){curl_setopt($ch,CURLOPT_POST,true);curl_setopt($ch,CURLOPT_POSTFIELDS,$data);}if(!empty($headers)){curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);}$bodycurl_exec($ch);$codecurl_getinfo($ch,CURLINFO_HTTP_CODE);curl_close($ch);return[code$code,body$body];}调用$resulthttp_request(POST,https://example.com,[typeaddition,limit100]);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 调用流程。$responsehttp_post(https://example.com,[typeaddition,limit100]);if($responsefalse){exit(接口请求失败);}$datajson_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 项目中的接口调用更加规范提高代码复用性和维护效率。