PHP 中使用 cURL 发送 POST 请求:2025 年指南

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

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

开始课程

PHP、cURL 和 HTTP POST:如何在 2025 年像专业人士一样发送数据

\n\n

如果您曾经编写过需要与另一台服务器“对话”的 PHP 代码——无论是提交表单、调用 API 还是仅仅传输数据——您很可能遇到过 cURL。它不仅仅是一个库,更是 HTTP 请求的瑞士军刀。尽管在 2025 年我们拥有像 Guzzle 或 Symfony HttpClient 这样更现代的工具,但 cURL 仍然是每个 PHP 开发者都需要了解的基础。

\n\n

在 Stack Overflow 上,"PHP, cURL, and HTTP POST example?" 这个问题获得了数千次浏览。为什么?因为这是每两个项目中就会遇到一次的任务:从集成支付系统到向 CRM 发送数据。让我们弄清楚如何正确、安全且优雅地完成这项工作。

\n\n

什么是 cURL,为什么在 PHP 中需要它?

\n\n

cURL(Client URL)是一个强大的库,它允许您的 PHP 脚本充当 HTTP 客户端。想象一下,您的代码就像一个没有界面的浏览器。它可以打开页面、提交表单、下载文件,甚至处理 Cookie。

\n\n

在 2025 年,cURL 仍然很重要,因为:

\n
    \n
  • 它内置于 PHP 中(无需安装额外的包)
  • \n
  • 比某些“重量级”库运行得更快
  • \n
  • 让您完全控制请求的每个方面
  • \n
  • 支持所有现代协议:HTTP/2、HTTPS、FTP 甚至 IMAP
  • \n
\n\n

基本示例:使用 cURL 发送 POST 请求

\n\n

让我们从经典示例开始。以下是最小可运行代码,用于向服务器发送 POST 请求:

\n\n
<?php\n// 发送数据的目标 URL\n$url = 'https://api.example.com/submit';\n\n// 要发送的数据(关联数组)\n$postData = [\n    'name' => '伊万·彼得罗夫',\n    'email' => 'ivan@example.com',\n    'message' => '来自 2025 年的问候!'\n];\n\n// 初始化 cURL\n$ch = curl_init($url);\n\n// 请求设置\ncurl_setopt_array($ch, [\n    CURLOPT_POST => true,                          // 这是 POST 请求\n    CURLOPT_POSTFIELDS => http_build_query($postData), // 字符串格式的数据\n    CURLOPT_RETURNTRANSFER => true,                // 将响应作为字符串返回\n    CURLOPT_HEADER => false,                       // 不返回标头\n    CURLOPT_TIMEOUT => 30,                         // 超时时间 30 秒\n    CURLOPT_SSL_VERIFYPEER => true,                // 验证 SSL 证书\n]);\n\n// 执行请求\n$response = curl_exec($ch);\n\n// 检查错误\nif (curl_errno($ch)) {\n    echo 'cURL 错误:' . curl_error($ch);\n} else {\n    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n    echo "HTTP 响应代码:$httpCode\\n";\n    echo "响应正文:$response";\n}\n\n// 关闭连接\ncurl_close($ch);\n?>
\n\n

请注意 http_build_query()。这是一个方便的函数,可以将数组转换为 URL 编码的字符串。没有它,cURL 可能无法正确处理数据。

\n\n

发送 JSON 而不是表单数据

\n\n

在 2025 年,大多数 API 使用 JSON 而不是传统的 POST 表单。以下是如何调整我们的示例:

\n\n
<?php\n$url = 'https://api.example.com/v2/users';\n$jsonData = json_encode([\n    'username' => 'developer_2025',\n    'password' => 'secret_password',\n    'role' => 'admin'\n]);\n\n$ch = curl_init($url);\ncurl_setopt_array($ch, [\n    CURLOPT_POST => true,\n    CURLOPT_POSTFIELDS => $jsonData,  // 发送原始 JSON\n    CURLOPT_HTTPHEADER => [           // 重要:指定标头\n        'Content-Type: application/json',\n        'Content-Length: ' . strlen($jsonData),\n        'Accept: application/json'\n    ],\n    CURLOPT_RETURNTRANSFER => true,\n    CURLOPT_TIMEOUT => 15,\n]);\n\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\nif ($htt                

博客

书籍推荐