news 2026/10/7 10:07:18

PHP封装 GET 和 POST 请求函数详解:使用 cURL 调用 HTTP API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP封装 GET 和 POST 请求函数详解:使用 cURL 调用 HTTP API

在 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=100

GET 请求通常用于:

  • 获取数据
  • 查询资源
  • 获取配置

三、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 项目中的接口调用更加规范,提高代码复用性和维护效率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 10:07:03

酒店家具防潮秘籍:全流程防护解析

酒店客房家具防潮处理工艺解析在酒店运营中&#xff0c;客房家具的耐用性与舒适度直接影响宾客体验与品牌形象。潮湿环境易导致木材变形、开裂、发霉&#xff0c;进而影响家具外观与使用寿命。因此&#xff0c;科学有效的防潮处理工艺成为保障客房家具品质的关键环节。以下是常…

作者头像 李华
网站建设 2026/10/7 10:06:50

如何在 Linux 中检查网卡速度(NIC Speed):全面技术指南

网络接口卡&#xff08;NIC&#xff0c;Network Interface Card&#xff09;&#xff0c;通常简称“网卡”&#xff0c;是计算机与网络通信的核心硬件组件。网卡速度&#xff08;即链路速度&#xff0c;Link Speed&#xff09;指的是网卡与交换机或路由器之间协商的最大数据传输…

作者头像 李华
网站建设 2026/10/7 10:04:48

PX4 日志分析与飞行异常诊断实战指南

一句话掌握&#xff1a;ULog 是二进制自描述日志格式&#xff0c;靠 F 段自带 schema&#xff08;结构定义&#xff09;&#xff0c;解析器无需硬编码字段顺序&#xff0c;这是它优于 CSV 的根本原因&#xff1b;飞行异常诊断的入口是「用 EKF 测试比定位哪一路观测被拒绝或异常…

作者头像 李华
网站建设 2026/10/7 10:04:41

一句话生成爆款视频:WorkBuddy+Hypit本地工作流实战

1. 项目概述&#xff1a;用一句话生成爆款视频&#xff0c;不是玄学&#xff0c;是工具链的精准缝合“一句话复刻爆款视频”——这句话乍看像短视频平台的流量话术&#xff0c;但落到实操层面&#xff0c;它背后是一套可拆解、可复现、可批量化的视频生成工作流。我从去年开始系…

作者头像 李华