如何在 PHP 中发送 POST 请求:4 种实用方法及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何在 PHP 中发送 POST 请求:从新手到专家



您是否曾遇到过这样的情况:您的 PHP 脚本需要与另一台服务器“对话”?发送表单数据、调用外部 API,或者只是检查远程端点是否正常工作?如果是,那么您肯定问过这个问题:“How do I send a POST request with PHP?”。这是 Stack Overflow 上最热门的问题之一,这并非偶然——服务器之间的交互是现代网络的基础。



在本文中,我们将介绍四种在 PHP 中发送 POST 请求的可靠方法。您将学习如何使用 cURL、file_get_contents、stream_context_create 以及强大的 HTTP 客户端 Guzzle 来实现。我们不仅会展示代码——还会解释如何根据您的任务选择合适的方法,以及如何避免常见错误。



让我们开始吧!🚀



什么是 POST 请求,为什么在 PHP 中需要它?



POST 是 HTTP 协议的一种方法,用于向服务器发送数据。与 GET 不同,GET 的参数会显示在 URL 中,而 POST 将数据放在请求体中。这在以下情况下非常有用:



  • 提交注册或订单表单;
  • 调用 REST API(例如,在 CRM 中创建新记录);
  • 向远程服务器传输文件;
  • 在第三方服务上进行身份验证。


PHP 没有内置的“sendPostRequest()”函数,但有几种灵活的工具可以实现这一点。让我们逐一了解它们。



方法 1:cURL——全能选手



cURL(Client URL Library)可以说是 PHP 中最流行的发送 HTTP 请求的方式。它支持大量协议,能够处理 SSL、Cookie、超时和代理。如果您编写的代码比学习脚本更复杂——请考虑使用 cURL。



使用 cURL 发送简单的 POST 请求



以下是一个基本示例,向测试服务器 JSONPlaceholder 发送 POST 请求并输出响应:



// 1. 创建一个新的 cURL 资源$ch = curl_init();

// 2. 指定端点 URLcurl_setopt($ch, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");

// 3. 声明这是一个 POST 请求curl_setopt($ch, CURLOPT_POST, 1);

// 4. 传递数据(PHP 数组会自动转换为查询字符串)curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'title' => '我的第一篇帖子', 'body' => '这是帖子正文', 'userId' => 1]));

// 5. 返回结果,而不是直接输出curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 6. 执行请求$response = curl_exec($ch);

// 7. 检查错误if (curl_errno($ch)) { echo 'cURL 错误: ' . curl_error($ch);} else { // 8. 关闭连接 curl_close($ch); // 9. 输出结果 echo $response;}


使用 JSON 和标头发送 POST 请求



现代 API 通常使用 JSON。以下是如何发送 JSON 数据并设置正确的 Content-Type 标头:



$data = [    'email' => 'user@example.com',    'password' => 'secret123'];

$ch = curl_init('https://api.example.com/login');curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Accept: application/json']);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 获取响应 HTTP 状态码

curl_close($ch);

if ($httpCode === 200) { $result = json_decode($response, true); print_r($result);} else { echo "错误: HTTP $httpCode";}


为什么选择 cURL? 它提供了完全的控制权:您可以设置超时(CURLOPT_TIMEOUT)、跟随重定向(CURLOPT_FOLLOWLOCATION)、发送文件(CURLFile),甚至处理 FTP。唯一的缺点是代码比较冗长。



方

博客

书籍推荐