如何在PHP中发送POST请求:4种经过验证的方法

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

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

开始课程

引言:为什么PHP开发者需要掌握发送POST请求?

\n\n

想象一下这个场景:你正在用PHP编写一个网站,需要将数据发送到另一台服务器。例如,通过外部API注册用户、向CRM系统提交表单,或者测试你自己的POST请求处理器。这是每个Web开发者都会遇到的经典任务。

\n\n

在Stack Overflow上,“How do I send a POST request with PHP?”这个问题获得了数十万次浏览。这并非偶然:尽管PHP是一种强大的语言,但新手常常感到困惑:应该选择哪种方法?难道不能直接发送数据吗?

\n\n

当然可以。而且有四种不同的方法。在本文中,我们将逐一分析每种方法,展示真实的PHP代码示例,比较它们的性能,并告诉你何时使用哪种方法。读完本文后,你将能够自信地在任何项目中发送POST请求。

\n\n

方法1. 经典之选:cURL(最灵活、最强大)

\n\n

cURL是一个几乎存在于所有主机上的库。它支持HTTPS、Cookie、请求头、超时设置等等。如果你需要以最大控制度发送POST请求,请选择cURL。

\n\n

简单示例:发送包含name和email字段的表单

\n\n
<?php\n$url = 'https://api.example.com/submit';\n$data = [\n    'name' => '伊万·彼得罗夫',\n    'email' => 'ivan@example.com'\n];\n\n$ch = curl_init($url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));\n// 如果需要发送JSON:\n// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));\n// curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);\n\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\nif ($httpCode === 200) {\n    echo "成功!服务器响应:" . $response;\n} else {\n    echo "错误。HTTP状态码:" . $httpCode;\n}\n?>
\n\n

cURL的重要细节:

\n
    \n
  • http_build_query() — 将数组转换为类似 name=伊万&email=ivan@example.com 的字符串。这是表单的标准格式。
  • \n
  • curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) — 使请求结果返回到变量中,而不是直接输出。
  • \n
  • 始终检查响应的HTTP状态码(200表示成功,4xx/5xx表示错误)。
  • \n
  • 如果服务器要求JSON:将 http_build_query 替换为 json_encode,并添加 Content-Type: application/json 请求头。
  • \n
\n\n

方法2. 快速简单:带上下文的file_get_contents

\n\n

很多人知道 file_get_contents() 是用于读取文件的函数。但很少有人意识到,通过Stream Context,它也可以发送POST请求。如果你的任务简单,并且不想引入第三方库,这是一个很好的选择。

\n\n

通过file_get_contents发送POST请求的示例

\n\n
<?php\n$url = 'https://api.example.com/submit';\n$data = [\n    'name' => '伊万·彼得罗夫',\n    'email' => 'ivan@example.com'\n];\n\n$options = [\n    'http' => [\n        'header'  => "Content-Type: application/x-www-form-urlencoded\\r\\n",\n        'method'  => 'POST',\n        'content' => http_build_query($data)\n    ]\n];\n$context = stream_context_create($options);\n$result = file_get_contents($url, false, $context);\n\nif ($result === false) {\n    echo "发送请求时出错";\n} else {\n    echo "服务器响应:" . $result;\n}\n?>
\n\n

何时使用此方法?

\n
    \n
  • 当需要快速测试数据发送时。
  • \n
  • 当你不想编写大量cURL代码时。
  • \n
  • 缺点:错误处理困难(无法直接获取HTTP状态码)。
  • \n

博客

书籍推荐